Sympy Lambdify适配Runge-Kutta函数数组传参问题求助
解决Sympy Lambdify生成的洛伦兹函数无法接收数组参数的问题
问题根源在于:Sympy默认生成的lambdify函数会将洛伦兹方程组的变量(x,y,z)拆分为独立参数,但你的Runge-Kutta及轨迹计算函数期望接收数组/列表形式的状态向量作为输入,参数格式不匹配导致了TypeError。以下是三种可行的解决方法:
方法1:定义向量形式的Sympy方程组,直接生成适配数组的函数
通过Sympy的MatrixSymbol将状态变量定义为一个向量,再基于该向量构建方程组,lambdify后直接生成支持数组输入的函数:
import sympy as sp import numpy as np # 定义参数与状态向量符号 sigma, rho, beta = sp.symbols('sigma rho beta') X = sp.MatrixSymbol('X', 3, 1) # 3维状态向量 x, y, z = X[0], X[1], X[2] # 构建向量形式的洛伦兹方程组 dxdt = sigma * (y - x) dydt = x * (rho - z) - y dzdt = x * y - beta * z dXdt = sp.Matrix([dxdt, dydt, dzdt]) # 生成适配数组输入的函数 lambdifylorenz = sp.lambdify((X, sigma, rho, beta), dXdt, modules='numpy') # 测试调用(与自定义函数参数格式完全一致) condizione_iniziale = np.array([1.0, 0.0, 0.0]) print(lambdifylorenz(condizione_iniziale, 10, 28, 8/3))
方法2:包装现有lambdify函数,适配数组输入
如果你已经生成了基于独立参数的lambdify函数,可以写一个简单的包装函数,将数组拆分为单个变量传入,再将结果组合为数组返回:
import sympy as sp import numpy as np # 原有的lambdify函数生成方式(基于独立x,y,z参数) x, y, z = sp.symbols('x y z') sigma, rho, beta = sp.symbols('sigma rho beta') dxdt = sigma * (y - x) dydt = x * (rho - z) - y dzdt = x * y - beta * z original_lorenz = sp.lambdify((x, y, z, sigma, rho, beta), [dxdt, dydt, dzdt], modules='numpy') # 包装函数,将数组输入转换为独立参数 def lambdifylorenz(X, sigma, rho, beta): x_val, y_val, z_val = X return np.array(original_lorenz(x_val, y_val, z_val, sigma, rho, beta)) # 测试调用 condizione_iniziale = np.array([1.0, 0.0, 0.0]) print(lambdifylorenz(condizione_iniziale, 10, 28, 8/3))
方法3:通过变量替换让lambdify函数支持数组输入
在lambdify时直接将x,y,z替换为数组的索引,生成支持数组输入的函数:
import sympy as sp import numpy as np x, y, z = sp.symbols('x y z') sigma, rho, beta = sp.symbols('sigma rho beta') dxdt = sigma * (y - x) dydt = x * (rho - z) - y dzdt = x * y - beta * z # 将x,y,z替换为数组X的索引,生成适配函数 lambdifylorenz = sp.lambdify(('X', sigma, rho, beta), [dxdt.subs({x:X[0], y:X[1], z:X[2]}), dydt.subs({x:X[0], y:X[1], z:X[2]}), dzdt.subs({x:X[0], y:X[1], z:X[2]})], modules='numpy') # 测试调用 condizione_iniziale = np.array([1.0, 0.0, 0.0]) print(lambdifylorenz(condizione_iniziale, 10, 28, 8/3))
以上三种方法生成的lambdifylorenz函数均可以直接适配你现有的runge_kutta和flusso_traiettoria_singola函数的调用方式。
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

