自动化上述功能,这样我就不必每次都写一个额外的术语



我想知道如何自动化这个代码:

import numpy as np
import matplotlib.pyplot as plt

f = lambda x: x**2 / np.pi**2 * np.sin(x)
a = 2*np.pi
b = 0

midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)))
print(midpoint(3))
midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)))
print(midpoint(4))
midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)) + f(a/(2*n)+(4*a/n)))
print(midpoint(5))
midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)) + f(a/(2*n)+(4*a/n)) + f(a/(2*n)+(5*a/n)))
print(midpoint(6))
midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)) + f(a/(2*n)+(4*a/n)) + f(a/(2*n)+(5*a/n)) + f(a/(2*n)+(6*a/n)))
print(midpoint(7))

每个中点中的项数对应于打印语句中的值

例如,第一个中点函数有3项,因此在3处进行评估。第二个中点函数有4项,因此在4处进行评估。我需要这样一直持续到20岁,每次都不增加一个额外的学期。

如果一切都做得正确,数字应该越来越接近数字"-4">

对于任何想知道的人来说,这是中点集成

怎么样:

import numpy as np
import matplotlib.pyplot as plt
def midpoint(f, a, n):
sum = 0
for i in range(n):
sum += f(a/(2*n)+(i*a/n))
return (a/n) * sum
# Constants
F = lambda x: x**2 / np.pi**2 * np.sin(x)
A = 2*np.pi
B = 0
# Print some examples
for n in range(3, 8):
print(midpoint(F, A, n))

代码:

for k in range(3, 20):
midpoint = lambda n: (a/n) * sum(f(a/(2*n) + (i*a/n)) for i in range(k))
print(midpoint(k))

说明:

显然,术语的数量只是递增的。有些棘手的部分是添加附加条款。此位:

sum(f(a/(2*n) + (i*a/n)) for i in range(k))

利用了添加的术语遵循可预测模式的事实:

term 0 = f(a/(2*n))         = f(a/(2*n) + 0*a/n)
term 1 = f(a/(2*n) + a/n)   = f(a/(2*n) + 1*a/n)
term 2 = f(a/(2*n) + 2*a/n) = f(a/(2*n) + 2*a/n)

等等。

所有变化的是传递给f的和的后半部分的系数,所以很容易将和汇总到一个循环中。

最新更新