Simpson与Python的集成:Can';无法获得预期的输出
我已经实现了这个Simpson与Python的集成:Can';无法获得预期的输出,python,integration,intervals,convergence,simpsons-rule,Python,Integration,Intervals,Convergence,Simpsons Rule,我已经实现了这个偶数()&simpson(),但是无法获得所需的输出。其次,获取错误([lambda x:1/x,1,11,6]])ZeroDivisionError:division by zero,无法理解此错误 import math import matplotlib import matplotlib.pyplot as plt import numpy as np def even(x): if x % 2 == 0: return 2 else:
偶数()
&simpson()
,但是无法获得所需的输出。其次,获取错误([lambda x:1/x,1,11,6]])ZeroDivisionError:division by zero
,无法理解此错误
import math
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
def even(x):
if x % 2 == 0:
return 2
else:
return 4
def simpson(fn,a,b,n):
ans = 0
for x in range(1, n):
ans = ans + even(x) * fn(x)
return ((b - a) / (3 * n)) * (ans + fn(0) + fn(n))
if __name__ == "__main__":
"""
The code in "__main__" is not being graded, but a tool for you to test
your code outside of the `test_a8.py`. Feel free to add print statements.
"""
data = [[lambda x:3*(x**2)+1, 0,6,2],
[lambda x:x**2,0,5,6],
[lambda x:math.sin(x), 0,math.pi, 4],
[lambda x:1/x, 1, 11, 6]]
for d in data:
f,a,b,n = d
print(simpson(f,a,b,n))
t = np.arange(0.0, 10.0,.1)
fig,ax = plt.subplots()
s = np.arange(0,6.1,.1)
ax.plot(t, (lambda t: 3*(t**2) + 1)(t),'g')
plt.fill_between(s,(lambda t: 3*(t**2) + 1)(s))
ax.grid()
ax.set(xlabel ="x", ylabel=r"$f(x)=3x^2 + 1$",
title = r"Area under the curve $\int_0^6\,f(x)$")
plt.show()
我正在尝试这样的预期输出
222.0
41.66666666666667
2.0045597549844207
2.4491973405016885
我是否正确地将第三个数字解释为包括终点在内的总分计数?如果是,请执行以下操作。您使
偶数
函数太重(不需要if,只需要整数计算)。代码的主要问题是,只在整数点上循环x
,并从零开始(当然,参数a
和b
应该是边界)
不要期望你提供的输出。您应该为每个范围指定至少30-50个点,以使结果接近准确,2-6太小。如果使用100分,结果将接近预期。欢迎使用SO。请正确格式化您的代码。@miquelvir不说“请正确格式化您的代码”,您可以通过提问来演示它是如何完成的。至少,你应该指向OP,这样他们知道当你说“正确格式化”时该怎么做@Raza我为你格式化了你的问题。请看一下Stack Overflow的降价语法是如何工作的,以及如何很好地格式化您的问题。请不要回滚对格式的更改—您的问题更具可读性,因此如果格式正确,可能会得到有用的答案。@PranavHosangadi true,我对0除错误的看法,
lambda x:1/x,1,11,6
在x=0
时中断,因为1/0是无穷大的。
import math
import numpy as np
def simpson(fn,a,b,n):
# n = n + 2 # uncomment this line if only inner points are included in n
ans = sum((2-i%2)*fn(x) for i,x in enumerate(np.linspace(a,b,n)[1:-1]))
return ((b - a) / (3 * n)) * (fn(a) + 2*ans + fn(b))
data = [[lambda x:3*(x**2)+1, 0,6,2],
[lambda x:x**2,0,5,6],
[lambda x:math.sin(x), 0,math.pi, 4],
[lambda x:1/x, 1, 11, 6]]
for d in data:
f,a,b,n = d
print(simpson(f,a,b,n))