python - 有没有办法整合并获得一个数组或一个函数,而不是曲线下的所有区域?
问题描述
我想整合以下等式:
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,但似乎这些函数只返回曲线下的面积,即一个数字,我有兴趣得到一个数组或一个函数(求解 Ψ)。
解决方案
您要做的是求解微分方程。因为它是二阶微分方程,您应该修改您的函数以使其成为一阶 ODE 系统。所以你必须创建一个这样的函数:
假设 ρ=rho
def f(z, y):
return np.array([y[1], A*rho(z)])
其中 y 是一个向量,它在第一个位置包含 Ψ,在第二个位置包含它的导数。然后,f 返回一个包含 Ψ 的一阶和二阶导数的向量。
完成后,您可以使用scipy.integrate.solve_ivp来解决问题:
scipy.integrate.solve_ivp(f, [z_start, z_final], y0, method='RK45', z_eval)
其中 y0 是 Ψ 的初始条件(Ψ 的值及其在 z_start 处的导数)。z_eval 是您要存储解决方案的点。解决方案将是一个包含 Ψ 值及其导数的数组。
推荐阅读
- c# - 打字稿为什么我的 Get 请求以骆驼案的形式出现?
- bixby - Bixby Capsule 中 Javascript API 中的“类型”模块的目的是什么?
- kdb - Q/Kdb:组合两列以创建一个新列作为列表
- javascript - 如何在 Flow 中声明一个更改参数而没有 ESLint 错误的函数
- java - 将使用记录器的错误正确转换为常规字符串
- php - 405 方法不允许 - PUT (PHP)
- java - @Refreshscope 与 DriverManagerDataSource
- python-3.x - 如何通过其中一列中的每个值将一列随机数添加到数据框中?
- node.js - 如何测试我的猫鼬预保存钩子中的 if 语句
- sql-server - 为什么执行存储过程会导致它被创建