繁体   English   中英

如何使用 x^2 在 Python 中进行(空中飞人)集成?

[英]How to do a (trapeze) integration in Python with x^2?

我的任务是首先与f(x)=x^2的 Python 进行积分,然后进行梯形积分

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)

在此处输入图像描述

现在我想把这个 function 整合起来得到这个: F(x)=(1/3)x^3与图片:

在此处输入图像描述

这到底应该是output:

在此处输入图像描述

有人可以解释一下如何用 python 获得 f(x)=x^2 的反导数 F(x) 吗? 我想通过普通积分和空中飞人积分来做到这一点。 对于从(-10 到 10)的梯形积分,步长为 0.01(梯形的宽度)。 最后我想在这两种情况下都得到 function F(x)=(1/3)x^3 。 我怎样才能做到这一点?

谢谢你帮助我。

有两个关键的观察结果:

  • 梯形法则是指数值积分,其 output 不是积分 function 而是一个数
  • 积分取决于您对F(x)的定义中未包含的任意常数

考虑到这一点,您可以使用scipy.integrate.trapz()来定义积分 function:

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

或者,更有效地,使用scipy.integrate.cumtrapz() (从上面进行计算):

import numpy as np
from scipy.integrate import cumtrapz


def numeric_integral(x, f, c=0):
    return cumtrapz(f(x), x, initial=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()代替。

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

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]

梯形积分

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()

在这里,我应用了理论公式(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)

请注意,为了 plot xF ,它们必须具有相同数量的元素; 所以我忽略了x的第一个元素,所以它们都有199元素。 这是梯形方法d 的结果:如果对包含n元素的数组f进行积分,则会得到包含n-1元素的数组F 此外,我在x = -10处将F的初始值设置为-333.35 ,这是积分过程中的任意常数,我决定该值是为了在原点附近通过 function。


分析整合

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 = sy.integrate(f, x)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM