有没有办法整合并获得一个数组或函数而不是曲线下的所有区域?
Is there a way to integrate and get an array or a function instead of all the area under the curve?
我想对以下方程求积分:
d^2[Ψ(z)] / dz^2 = A * ρ(z)
其中 Ψ(未知)和 ρ(已知)是一维数组,A 是常数。
我已经进行了泰勒展开,即
d^2[Ψ(z_0)] / dz^2 = [Ψ(z0+Δz) - 2Ψ(z0) + Ψ(z0-Δz)] / [Δz^2]
并通过构建矩阵成功求解。
现在,我想知道是否有Python(最好)或Matlab函数可以解决这个函数而无需进行泰勒展开。
我试过numpy.trapz和scipy.integrate.quad,但是好像这些函数只return曲线下的面积,也就是一个数字,我有兴趣得到一个数组或函数(求解 Ψ)。
你要做的是解微分方程。因为它是二阶微分方程,您应该修改您的函数,使其成为一阶 ODE 系统。所以你必须创建一个这样的函数:
假设 ρ=rho
def f(z, y):
return np.array([y[1], A*rho(z)])
其中 y 是一个向量,在第一个位置包含 Ψ,在第二个位置包含它的导数。然后,f returns 包含 Ψ 的一阶和二阶导数的向量。
完成后,您可以使用scipy.integrate.solve_ivp解决问题:
scipy.integrate.solve_ivp(f, [z_start, z_final], y0, method='RK45', z_eval)
其中 y0 是 Ψ 的初始条件(Ψ 的值及其在 z_start 处的导数)。 z_eval 是您要存储解决方案的点。解决方案将是一个数组,其中包含 Ψ 及其导数的值。
您可以使用不定积分对 rho 进行两次积分。例如
import numpy as np
x=np.arange(0,3.1,0.1)
rho = x**3 # replace your rho here....
indef_integral1 = [np.trapz(rho[0:i],x[0:i]) for i in range(2,len(rho))]
indef_integral2 = [np.trapz(indef_integral1[0:i],x[0:i]) for i in range(2,len(indef_integral1))]
我想对以下方程求积分:
d^2[Ψ(z)] / dz^2 = A * ρ(z)
其中 Ψ(未知)和 ρ(已知)是一维数组,A 是常数。
我已经进行了泰勒展开,即
d^2[Ψ(z_0)] / dz^2 = [Ψ(z0+Δz) - 2Ψ(z0) + Ψ(z0-Δz)] / [Δz^2]
并通过构建矩阵成功求解。
现在,我想知道是否有Python(最好)或Matlab函数可以解决这个函数而无需进行泰勒展开。
我试过numpy.trapz和scipy.integrate.quad,但是好像这些函数只return曲线下的面积,也就是一个数字,我有兴趣得到一个数组或函数(求解 Ψ)。
你要做的是解微分方程。因为它是二阶微分方程,您应该修改您的函数,使其成为一阶 ODE 系统。所以你必须创建一个这样的函数:
假设 ρ=rho
def f(z, y):
return np.array([y[1], A*rho(z)])
其中 y 是一个向量,在第一个位置包含 Ψ,在第二个位置包含它的导数。然后,f returns 包含 Ψ 的一阶和二阶导数的向量。
完成后,您可以使用scipy.integrate.solve_ivp解决问题:
scipy.integrate.solve_ivp(f, [z_start, z_final], y0, method='RK45', z_eval)
其中 y0 是 Ψ 的初始条件(Ψ 的值及其在 z_start 处的导数)。 z_eval 是您要存储解决方案的点。解决方案将是一个数组,其中包含 Ψ 及其导数的值。
您可以使用不定积分对 rho 进行两次积分。例如
import numpy as np
x=np.arange(0,3.1,0.1)
rho = x**3 # replace your rho here....
indef_integral1 = [np.trapz(rho[0:i],x[0:i]) for i in range(2,len(rho))]
indef_integral2 = [np.trapz(indef_integral1[0:i],x[0:i]) for i in range(2,len(indef_integral1))]