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;
仿真结果如下:
热门推荐
海陵岛水上运动全攻略:从海面到海底的全方位体验
海陵岛最佳旅游季节全攻略:从气候特点到实用建议
海陵岛冬游打卡:大角湾、马尾岛、天麓山公园
海陵岛绝美摄影地推荐:大角湾&神前湿地
阿尔茨海默病:症状、病因、风险因素及预防措施
探索智慧养羊方案:认养一只羊的全新体验
如何运用巽卦意象:在思维、行为、人际与心态中保持灵活与适应
把握好这5点,提升法考上岸几率!
美国车祸律师费用结构主要是按小时收费、固定费用和或有收费(不成功不收费)
孩子90%的问题都跟积食有关?积食最怕“拖”,越拖越伤娃
朱丹自曝对鸡蛋过敏!湿疹患者需警惕这些食物
吃深海鱼,轻松告别湿疹烦恼!
冬季家庭防盗:卧室门锁升级攻略
如何检查家里的不锈钢锁芯?这份实用指南请收好!
亲生小羊的护理指南
农村过年禁忌大揭秘:你家有这些习俗吗?
春节聚会必知:心理学教你避开禁忌话题
新春拜年健康话题大忌!这些话别乱说
停药也是一门艺术:关于抗抑郁药,医生没告诉你的事
净水tds达到多少可以直饮
走进科尔沁草原的辽阔天地
科尔沁草原历史文化
“技术开锁”入车门,流窜盗窃进牢门
俄罗斯为何使用东罗马帝国的双头鹰,作为自己的国徽
微波炉烤红薯:简单快捷的美味制作方法
十二生肖:春节最强文化符号的前世今生
十二生肖:古人的时尚生活指南
福建惠安石雕生肖:传统工艺与现代科技的完美结合
蝴蝶兰的光照需求(喜阳还是喜阴?如何为蝴蝶兰提供最佳光照条件?)
养兰花别怕浇水:把握好氧的生长规律