You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Modelica中正确描述dy/dx形式的导数?

如何在Modelica中正确表示dy/dx形式的导数?

你碰到的这个问题其实是求解器初始化时的数值陷阱问题——直接写der(y)/der(x)=5的话,当x=time²时,初始时刻time=0,此时der(x)=2*time=0,自然就触发了除零错误,导致仿真启动失败。其实咱们完全可以通过数学上的简单变形,既准确表达dy/dx的关系,又避开这个问题,而且写法比你之前的折中方案更通用。

核心思路:用链式法则替代除法

dy/dx的本质是y对x的导数,根据链式法则,y对时间的导数等于y对x的导数乘以x对时间的导数,也就是:
$$\frac{dy}{dt} = \frac{dy}{dx} \cdot \frac{dx}{dt}$$
对应到Modelica里就是der(y) = (dy/dx的表达式) * der(x),这样就彻底去掉了除法,再也不会有除零的风险。

修正后的代码示例

针对你的例子,把dy/dx=5转化为der(y)=5*der(x),代码如下:

model CorrectDerivativeExpression "dy/dx=5, properly expressed in Modelica"
  Real x,y;
equation
  x = time^2;
  der(y) = 5 * der(x);
end CorrectDerivativeExpression;

这个版本的代码在初始时刻der(x)=0时,只会让der(y)=0,完全符合原方程的逻辑(当x没有变化时,y也不应该变化),仿真可以正常启动运行。

和你之前折中方案的对比

x=time时,der(x)=1,此时der(y)=5*1=5,和你之前写的der(y)=5效果完全一致,但这种写法的优势在于通用性——不管x是time的什么函数(比如time的三次方、正弦函数等等),都能准确表达dy/dx的关系,不需要针对不同的x表达式修改代码。

扩展到更复杂的情况

如果你的dy/dx是x和y的函数,比如dy/dx = x*y,同样可以用这个思路转化:

model ComplexDerivativeExpression "dy/dx=x*y, properly expressed"
  Real x,y;
equation
  x = time^2;
  der(y) = x*y * der(x);
end ComplexDerivativeExpression;

这种写法始终能避免除零问题,同时严格遵循原方程的数学定义。

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

火山引擎 最新活动