问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Modelica中多项式函数的定义与微分计算

创作时间:
作者:
@小白创作中心

Modelica中多项式函数的定义与微分计算

引用
1
来源
1.
http://modelicabyexample.globalcrown.com.cn/behavior/functions/polynomial/

本文详细介绍了如何在Modelica中定义和使用多项式计算函数,包括函数的数学定义、Modelica代码实现以及如何处理函数的导数计算。文章内容深入且系统,适合对Modelica编程感兴趣的读者学习参考。

计算多项式结果

数学定义

本节的目标是创建一个函数,用于计算任意的多项式。我们已经看到了一些基本的函数。在此基础上,我们将构建一个函数,其调用方式如下:

[p(x, \vec{c})]

其中,(x)代表独立变量,(\vec{c})代表系数组成的向量。多项式以如下方式计算:

[p(x, \vec{c}) = \sum_{i=1}^{N} c_i x^{N-i}]

其中,(N)是传递给函数的系数的个数。需要注意的是:

  1. (\vec{c})的第一个元素对应多项式中的最高阶次项
  2. (\vec{c})的元素是从1开始编号的

这种方法在处理有限精度的浮点数时更为高效和精确。对于一个4阶多项式,其表达式为:

[p(x, \vec{c}) = ((c_1 x + c_2) x + c_3) x +c_4]

这种方法仅使用简单的乘法和加法操作,避免了复杂的求幂运算,同时减少了舍入误差和截尾误差。

Modelica定义

在Modelica中,多项式计算函数可以这样定义:

function Polynomial "Create a generic polynomial from coefficients"
 input Real x "Independent variable";
 input Real c[:] "Polynomial coefficients";
 output Real y "Computed polynomial value";
protected
 Integer n = size(c,1);
algorithm
 y := c[1];
 for i in 2:n loop
 y := y*x + c[i];
 end for;
end Polynomial;

让我们通过一个模型来验证这个函数的正确性:

model EvaluationTest1 "Model that evaluates a polynomial"
 Real yf;
 Real yp;
equation
 yf = Polynomial(time, {1, -2, 2});
 yp = time^2-2*time+2;
end EvaluationTest1;

微分

在Modelica中,多项式计算的结果可能需要被求导。例如:

model Differentiation1 "Model that differentiates a function"
 Real yf;
 Real yp;
 Real d_yf;
 Real d_yp;
equation
 yf = Polynomial(time, {1, -2, 2});
 yp = time^2-2*time+2;
 d_yf = der(yf); // How to compute?
 d_yp = der(yp);
end Differentiation1;

为了解决这个问题,我们可以使用annotation来指定导数的计算方法:

function PolynomialWithDerivative
 "Create a generic polynomial from coefficients (with derivative information)"
 input Real x "Independent variable";
 input Real c[:] "Polynomial coefficients";
 output Real y "Computed polynomial value";
protected
 Integer n = size(c,1);
algorithm
 y := c[1];
 for i in 2:n loop
 y := y*x + c[i];
 end for;
 annotation(derivative=PolynomialFirstDerivative);
end PolynomialWithDerivative;

接下来,我们需要定义PolynomialFirstDerivative函数:

function PolynomialFirstDerivative
 "First derivative of the function Polynomial"
 input Real x;
 input Real c[:];
 input Real x_der;
 input Real c_der[size(c,1)];
 output Real y_der;
protected
 Integer n = size(c,1);
 Real c_diff[n-1] = {(n-i)*c[i] for i in 1:n-1};
algorithm
 y_der :=PolynomialWithDerivative(x, c_diff)*x_der +
 PolynomialWithDerivative(x, c_der);
end PolynomialFirstDerivative;

最后,我们可以通过以下模型来使用这些函数:

model Differentiation2 "Model that differentiates a function using derivative annotation"
 Real yf;
 Real yp;
 Real d_yf;
 Real d_yp;
equation
 yf = PolynomialWithDerivative(time, {1, -2, 2});
 yp = time^2-2*time+2;
 d_yf = der(yf);
 d_yp = der(yp);
end Differentiation2;

仿真结果如下:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号