입력 방정식과 입력 변수를 사용하여 합계를 취하는 sigsum () 함수를 만들고 있습니다. 지금까지 내가 가진 내용은 다음과 같습니다.
def sigsum(eqn, index, lower=0, upper=None, step=1):
if type(step) is not int:
raise TypeError('step must be an integer')
elif step < 1:
raise ValueError('step must be greater than or equal to 1')
if upper is None:
upper = 1280000
if lower is None:
lower = -1280000
if (upper - lower) % step:
upper -= (upper - lower) % step
index = lower
total = 0
while True:
total += eqn
if index == upper:
break
index += step
return total
기능 사용 :
print(sigsum('1/(i+5)','i'))
>>> 12.5563
내 현재 문제는 'eqn'과 'index'를 함수 로컬 네임 스페이스 내에 존재하는 변수로 변환하는 것입니다. exec를 사용하는 것은 좋은 생각이 아니며 아마도 setattr ()이 작동 할 수 있다고 들었습니다. 누구든지 나를 도울 수 있습니까? 감사.
들어 eqn
나는 람다 함수를 사용하는 것이 좋습니다 :
eqn = lambda i: 1 / (i + 5)
다음 index
은 그냥 "함수에 전달 된 변수"이기 때문에, 필요하지 않습니다 (이름이 필요하지 않습니다).
그러면 당신의 기능은
def integrate(fn, start = 0, end = 128000, step = 1):
"""
Return a stepwise approximation of
the integral of fn from start to end
"""
num_steps = (end - start) // step
if num_steps < 0:
raise ValueError("bad step value")
else:
return sum(fn(start + k*step) for k in range(num_steps))
그리고 당신은 그것을 실행할 수 있습니다
res = step_integrate(eqn) # => 10.253703030104417
여기에는 많은 단계가 있으며 많은 단계가 매우 적은 수를 포함합니다. 반올림 오류는 주요 문제가 될 수 있습니다. 정확도가 중요한 경우 수동으로 적분을 유도 할 수 있습니다.
from math import log
eqn = lambda i: 1 / (i + 5)
eqn.integral = lambda i: log(i + 5)
def integrate(fn, start = 0, end = 128000, step = 1):
"""
Return the integral of fn from start to end
If fn.integral is defined, used it;
otherwise do a stepwise approximation
"""
if hasattr(fn, "integral"):
return fn.integral(end) - fn.integral(start)
else:
num_steps = (end - start) // step
if num_steps < 0:
raise ValueError("bad step value")
else:
return sum(fn(start + k*step) for k in range(num_steps))
다시 실행되는
res = step_integrate(eqn) # => 10.150386692204735
(단계적 근사는 약 1 % 너무 높았습니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다