如何在Python中与x^2进行(梯形)集成?

如何在Python中与x^2进行(梯形)集成?,python,numpy,matplotlib,math,integration,Python,Numpy,Matplotlib,Math,Integration,我的任务是首先用Python进行集成,然后用Python进行梯形集成,f(x)=x^2 import numpy as np import matplotlib.pyplot as plt x = np.arange(-10,10) y = x**2 l=plt.plot(x,y) plt.show(l) 现在我想集成这个函数来得到:F(x)=(1/3)x^3与图片: 这应该是最终的输出: 有人能解释一下如何用python得到F(x)=x^2的反导数F(x)吗? 我想用一个标准

我的任务是首先用Python进行集成,然后用Python进行梯形集成,f(x)=x^2

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,10)   
y = x**2

l=plt.plot(x,y)
plt.show(l)

现在我想集成这个函数来得到:F(x)=(1/3)x^3与图片:

这应该是最终的输出:

有人能解释一下如何用python得到F(x)=x^2的反导数F(x)吗? 我想用一个标准积分和一个梯形积分。对于从(-10到10)的梯形积分,步长为0.01(梯形宽度)。最后,我想得到两种情况下的函数F(x)=(1/3)x^3。我怎样才能到达这里


谢谢你的帮助。

梯形集成

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 10, 0.1)
f = x**2

F = [-333.35]
for i in range(1, len(x) - 1):
    F.append((f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1])
F = np.array(F)

fig, ax = plt.subplots()

ax.plot(x, f)
ax.plot(x[1:], F)

plt.show()
import sympy as sy
import numpy as np
import matplotlib.pyplot as plt

x = sy.symbols('x')
f = x**2
F = sy.integrate(f, x)

xv = np.arange(-10, 10, 0.1)
fv = sy.lambdify(x, f)(xv)
Fv = sy.lambdify(x, F)(xv)

fig, ax = plt.subplots()

ax.plot(xv, fv)
ax.plot(xv, Fv)

plt.show()
这里我应用了理论公式
(f[I]+f[I-1])*(x[I]-x[I-1])/2+f[I-1]
,而积分是在块中完成的:

F = [-333.35]
for i in range(1, len(x) - 1):
    F.append((f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1])
F = np.array(F)
F = sy.integrate(f, x)
注意为了绘制
x
F
,它们必须具有相同数量的元素;所以我忽略了
x
的第一个元素,所以它们都有
199
元素。这是梯形方法的结果:如果集成
n
元素的数组
f
,则获得
n-1
元素的数组
f
。此外,我在
x=-10
处将
F
的初始值设置为
-333.35
,这是积分过程中的任意常数,我决定该值是为了在原点附近传递函数


分析集成

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 10, 0.1)
f = x**2

F = [-333.35]
for i in range(1, len(x) - 1):
    F.append((f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1])
F = np.array(F)

fig, ax = plt.subplots()

ax.plot(x, f)
ax.plot(x[1:], F)

plt.show()
import sympy as sy
import numpy as np
import matplotlib.pyplot as plt

x = sy.symbols('x')
f = x**2
F = sy.integrate(f, x)

xv = np.arange(-10, 10, 0.1)
fv = sy.lambdify(x, f)(xv)
Fv = sy.lambdify(x, F)(xv)

fig, ax = plt.subplots()

ax.plot(xv, fv)
ax.plot(xv, Fv)

plt.show()
这里我通过
sympy
模块使用符号数学。集成在块中完成:

F = [-333.35]
for i in range(1, len(x) - 1):
    F.append((f[i] + f[i - 1])*(x[i] - x[i - 1])/2 + F[i - 1])
F = np.array(F)
F = sy.integrate(f, x)

注意在这种情况下,
F
x
已经具有相同数量的元素。此外,代码更简单。

有两个关键观察结果:

  • 梯形规则指的是数值积分,其输出不是一个积分函数,而是一个数字
  • 积分是一个任意常数,该常数不包括在
    F(x)
考虑到这一点,您可以使用定义积分函数:

import numpy as np
from scipy.integrate import trapz


def numeric_integral(x, f, c=0):
    return np.array([sp.integrate.trapz(f(x[:i]), x[:i]) for i in range(len(x))]) + c
或者更有效地使用(从上面进行计算):

该图如下所示:

import matplotlib.pyplot as plt


def func(x):
    return x ** 2


x = np.arange(-10, 10, 0.01)
y = func(x)
Y = numeric_integral(x, func)

plt.plot(x, y, label='f(x) = x²')
plt.plot(x, Y, label='F(x) = x³/3 + c')
plt.plot(x, x ** 3 / 3, label='F(x) = x³/3')
plt.legend()
它为您提供除任意常量之外的指定结果,您应该自己指定该常量


为了更好地测量,虽然在这种情况下不相关,但请注意
np.arange()
如果与分步使用,则不会提供稳定的结果。通常,可以使用
np.linspace()

scipy的
cumtrapz
函数将使用梯形积分提供反导数:

from scipy.integrate import cumtrapz
yy = cumtrapz(y, x, initial=0)

# make yy==0 around x==0 (optional)
i_x0 = np.where(x >= 0)[0][0]
yy -= yy[i_x0]

我想你们可以先用谷歌搜索一下:我已经用谷歌搜索过了,但我找不到我想要的。注意你们使用的梯形积分是不正确的。你可以通过绘制
x**3/3
来看到它。你能给我解释一下这条线吗:(f[i]+f[i-1])*(x[i]-x[i-1])/2+f[i-1]@mathflower这是x轴和函数之间的梯形面积加上所有previos梯形的总和的公式。正如@norok2所说的,在该公式中,求出吊架的主基和次基(
f[i]
f[i-1]
),乘以吊架的高度(
x[i]-x[i-1]
),然后除以2,这是吊架面积的公式。最后,你把这个结果和前面的结果相加,
F[i-1]
你是怎么得出F[-333.35]的?我可以取另一个值吗?为什么使用c=0?“我能把它删掉吗?@mathflower,你当然可以删掉它。这只是为了解释一个恰当的数学,它说积分函数在代码中被定义为一个任意常数,
c
。我之所以问这个问题,是因为你手动插入了x**2的反导数,而不是计算它。你已经计算了反导数,但是用常数c。我只想在没有c@mathflower的情况下得到反导数,我不知道你指的是什么。
numeric\u integral()
中的代码一开始对
f()
一无所知。我只是绘制分析结果的完整性,仅此而已。
c
的存在具有数学意义。在这种数值方法中,其值仅取决于实际使用的
x
。没有一种数学上有效的方法可以获得一个值
c
,该值总是与您在分析反导数中找到的值相匹配,该反导数是使用您在微积分中对任意函数和所考虑的
x
范围研究的规则找到的。@mathflower换句话说,您希望得到
c=0
,但是你得到的是
c=F(x0)
x0
下极限的
x
。因为你(不得不假装你)不知道
F(x)
,所以你不能显式地计算
c