编写DiffEq求解器遇MethodError:无匹配similar(::Float64, ::Type{Float64})方法
问题解决:MethodError: no method matching similar(::Float64, ::Type{Float64})
错误原因分析
你的代码存在两个核心问题引发该错误:
- 微分方程函数的in-place要求:
SecondOrderODEProblem要求方程函数需直接修改传入的ddy数组,而非对ddy变量直接赋值。当前赋值写法会导致DiffEq内部无法正确处理内存分配逻辑。 - 数组索引缺失:你传入的
dy0、y0是一维数组,但方程中直接用整个数组(如dy ^ 2)运算,会触发数组运算错误,进而引发后续类型不匹配问题。
修正后的代码
using OrdinaryDiffEq, Plots, DifferentialEquations, StaticArrays # 初始条件(保持数组形式) y0 = [0.1] dy0 = [0.0] xspan = (0.0, 100.0) # 修正后的微分方程函数:in-place修改ddy,同时索引数组元素 function rot_chain(ddy, dy, y, p, x) dy_val = dy[1] y_val = y[1] ddy[1] = -(50.0 + 9.81 * dy_val) * (1 + 1 / (dy_val ^ 2)) / (50.0 * x + 9.81 * y_val) end # 定义问题 prob = SecondOrderODEProblem(rot_chain, dy0, y0, xspan) # 求解并绘图(显式指定求解器避免默认警告) sol = solve(prob, Tsit5()) plot(sol)
额外优化建议
如果你的方程是标量二阶ODE,可直接用标量初始条件简化代码:
y0 = 0.1 dy0 = 0.0 function rot_chain(ddy, dy, y, p, x) -(50.0 + 9.81 * dy) * (1 + 1 / (dy ^ 2)) / (50.0 * x + 9.81 * y) end
标量形式下函数可直接返回计算值,无需手动处理in-place修改,DiffEq会自动适配逻辑。
内容的提问来源于stack exchange,提问作者Martin Fekete
相关产品推荐
相关产品推荐

