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)是传递给函数的系数的个数。需要注意的是:
- (\vec{c})的第一个元素对应多项式中的最高阶次项
- (\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;
仿真结果如下:
热门推荐
查理·芒格:用多学科思维玩转股市
老花眼应该如何选择眼镜
秋冬养生新宠:小绿核桃
小绿核桃选购秘籍:一看二摸三闻四听
核桃树病虫害防治全攻略
大理:冬日里的诗意栖居
万宁&西双版纳:冬日避寒新宠!
大理古城:冬日避寒的文化之旅
广西北海:冬日避寒胜地,温暖如春!
武当山的道教文化之旅,你准备好了吗?
张三丰修炼地:武当山的文化探秘
秋冬打卡武当山:最美摄影点推荐!
周末打卡:棣花古镇的历史探秘
自驾游打卡安康石泉·熨斗古镇,享受悠闲时光!
陈炉古镇:瓷器上的城堡
苹果手机怎么绑定门禁卡?
视力模糊别轻忽!多发性硬化症经常出现眼部症状,专科医师图文解说
秋天的第一次户外运动,留给云南
丽江玉龙雪山旅游攻略:必备物品与注意事项
一起上春山,去看春天里的云南
海南环岛自驾游:988公里海岸线上的绝美风光
冬季自驾川藏线:一场勇敢者的冰雪之旅
自驾游摄影指南:捕捉最美瞬间!
川断泡水:轻松制作,享受健康益处
一岁小孩便秘能用开塞露吗?使用方法和注意事项全解析
赣州市旅游攻略:千年古城的文化与自然之美
秋日打卡:黄柏塬&关山草原
西安周边新玩法:山阳挂壁公路2日游攻略
华山论剑:西安周边一日游打卡胜地
告别婴儿胀气!跟着婴儿排气操一起做,图解教学有效解决婴儿胀气