You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写DiffEq求解器遇MethodError:无匹配similar(::Float64, ::Type{Float64})方法

问题解决:MethodError: no method matching similar(::Float64, ::Type{Float64})

错误原因分析

你的代码存在两个核心问题引发该错误:

  1. 微分方程函数的in-place要求:SecondOrderODEProblem要求方程函数需直接修改传入的ddy数组,而非对ddy变量直接赋值。当前赋值写法会导致DiffEq内部无法正确处理内存分配逻辑。
  2. 数组索引缺失:你传入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:14:50