gpt4 book ai didi

python - 使用 scipy.integrate.odeint 时出现类型错误

转载 作者:行者123 更新时间:2023-11-28 17:41:36 25 4
gpt4 key购买 nike

我正在尝试使用 scipy.integrate.odeint 求解一组耦合微分方程。但是,当我尝试运行该程序时,出现以下错误:

TypeError:无法根据规则“安全”odepack 将数组数据从 dtype('O') 转换为 dtype('float64')。错误:函数调用的结果不是正确的 float 组。

这是我使用的代码:

V = "v**2/2*log(1+x**2 + (y/a)**2 + (z/c)**2)" 
var = ['x','y','z']

def afleiden(func, var):
f = sympify(func)
partAfg = [f.diff(var[i]) for i in range(len(var))]
return partAfg



init=[0.3,0.2,0.9,0.2,0.6,0.7]

def func(rv, t, pot, var):
return rv[3:6] + afleiden(pot,var)

# rv is a list with 6 elements of witch the last 3 are part of the diff equations

t = np.arange(0,10,0.01)

y = odeint(func, init, t, args=(V, var,))

可能是因为 afleiden 中的方程是使用 Sympy 计算的,因此可能是 sypmpy 表达式?如果是这样,我能做些什么吗?我尝试使用 lambdify,但没有成功。

最佳答案

正如@Warren Weckesser 所说和您所怀疑的,您需要先对表达式进行 lambdify,以便各种偏导数 dV/dvar[j] 返回一个浮点值。

更一般地说,afleiden 函数的一个问题是它计算 V 的解析导数,而不计算这些表达式的值。我假设 v,a,c 是您问题的参数,描述了一个潜在的函数 V(x,y,z)。我还假设你的 o.d.e.是

dX/dt = dV/dX(x,y,z),

其中 X=[x,y,z] 是您的变量列表。

如果是这种情况,那么您有 3 个差异。方程式,而不是 func() 中的 6(列表的总和是列表的串联,而不是总和的列表)。

import numpy as np
from sympy import lambdify, sympify
from scipy.integrate import odeint

var = ['x', 'y', 'z']
V = sympify("v**2/2*log(1+x**2 + (y/a)**2 + (z/c)**2)")
dVdvar_analytical = [V.diff(var[i]) for i in range(len(var))]
dVdvar = [lambdify(('x', 'y', 'z', 'v', 'a', 'c'), df) for df in dVdvar_analytical]

def afleiden(variables, _, params, dVdvar):
x, y, z = variables
v, a, c = params
return [dVdvarj(x, y, z, v, a, c) for dVdvarj in dVdvar ]

variables0, params = [0.3, 0.2, 0.9], [0.2, 0.6, 0.7]

t = np.arange(0, 10, .1)
y = odeint(afleiden, variables0, t, args=(params, dVdvar))
plot(t, y)

与您对潜在 V 的表达一致,原点是一个排斥体,点 y(t) 在模拟中长时间趋于无穷大。如果在表达式的开头添加减号,则原点变为吸引子,解收敛于 0:

#example with minus sign
V = sympify("-v**2/2*log(1+x**2 + (y/a)**2 + (z/c)**2)")
t = np.arange(0, 100, .1)

enter image description here

关于python - 使用 scipy.integrate.odeint 时出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23396159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com