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

Julia中NonlinearSolve结合CoolProp出现MethodError问题求助

问题分析

错误核心原因:ModelingToolkit的符号变量/参数(Num类型)无法直接传递给CoolProp的PropsSI函数——PropsSI仅接受数值类型(如Float64),但你在定义方程时直接用符号参数T1、P1调用了PropsSI,触发类型转换失败。

另外代码存在隐藏问题:k1未被声明为变量,ModelingToolkit无法识别该符号,后续也会引发错误。

解决方案

需要将CoolProp的调用包装成ModelingToolkit可识别的符号函数,步骤如下:

  1. 定义包装函数,封装CoolProp的PropsSI调用,仅接收数值类型参数;
  2. 使用@register_symbolic宏注册包装函数,让ModelingToolkit将其视为符号函数处理;
  3. 补充声明k1为系统变量;
  4. 在方程中使用注册后的包装函数。

修正后的完整代码

using ModelingToolkit, NonlinearSolve, CoolProp

# 定义包装函数,封装CoolProp调用
function get_density(T::Real, P::Real)
    return PropsSI("D", "T", T, "P", P, "AIR")
end

function get_isentropic_coeff(T::Real, P::Real)
    return PropsSI("ISENTROPIC_EXPANSION_COEFFICIENT", "T", T, "P", P, "AIR")
end

# 注册包装函数,让ModelingToolkit识别为符号函数
@register_symbolic get_density(T, P)
@register_symbolic get_isentropic_coeff(T, P)

# 声明所有变量和参数
@variables dm ρ1 k1
@parameters a1 T1 P1

# 定义非线性系统,使用注册后的函数
eqs = [
    ρ1 ~ get_density(T1, P1),
    k1 ~ get_isentropic_coeff(T1, P1),
    dm ~ a1 * sqrt(k1*ρ1*P1*(2/(k1+1))^((k1+1)/(k1-1)))
]
@mtkbuild ns = NonlinearSystem(eqs, [dm, ρ1, k1], [a1, T1, P1])

d1 = 0.15e-3

guess = [
    dm => 0.5e-3,
    ρ1 => 20,
    k1 => 1.4  # 补充k1的初始猜测值(空气绝热指数约为1.4)
]

ps = [
    P1 => 20e5,
    a1 => (d1/2)^2 * pi,
    T1 => 293.0
]

prob = NonlinearProblem(ns, guess, ps)
sol = solve(prob, NewtonRaphson())
关键说明
  • @register_symbolic用于告知ModelingToolkit:该函数可接收符号输入,求解时会自动代入数值计算结果,避免直接传递Num类型给CoolProp;
  • 必须补充k1的变量声明和初始猜测值,因为它是系统中的中间未知量;
  • 包装函数添加::Real类型注解,确保只有数值类型传入CoolProp,避免符号类型泄漏。

内容的提问来源于stack exchange,提问作者Rasmus0909

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:15:16