我正在使用Dymola Version 2013.我尝试解决一个简单的数学问题,例如:
f= x^2 -4 ;
y=1;
f=y;
f和x定义为Real。解决方案是2.36。但我需要用两种解决方案来计算。那么2.36和-2.36! 在我的问题中,f是像ax ^ 3 + bx ^ 2 + cx + d的多项式 而y是线性的。 y = ax + b
如何获得此问题的所有解决方案? x没有明确的价值。 x通常至少有两种解决方案。 x应该是一个向量吗?在这种情况下,我遇到了等式的问题...... 有人能帮助我吗?
答案 0 :(得分:1)
如果我理解正确,你的目标是使用Modelica来查找(高于二阶)多项式的所有根。我担心这不是Modelica的用途。对于给定的非线性方程,Modelica模型的模拟将使用(最多)非线性方程的一个根。如果你想找到所有的根,你必须找到一种方法来自己计算多项式。在您的情况下,您只处理三次多项式,因此您应该研究分解三次多项式的算法。然后,您可以将此算法编写为Modelica函数。
答案 1 :(得分:0)
正如我理解你的问题,你有两个多项式,并希望找到它们相等的所有点
这是一个使用Modelica.Math.Vectors.Utilities.roots
执行此操作的函数:
首先,您给出两个多项式poly1
和poly2
。查找poly1=poly2
与查找poly1-poly2=0
相同,因此我定义第三个多项式polyDiff = polyLong-polyShort
,然后将该多项式移交给Modelica.Math.Vectors.Utilities.roots
。它将返回所有根,甚至是复杂的根。
function polyIntersect
input Real[:] poly1={3,2,1,0};
input Real[:] poly2={8,7};
output Real[:,2] intersect;
protected
Integer nPoly1 = size(poly1,1);
Integer nPoly2 = size(poly2,1);
Integer nPolyShort = min(nPoly1, nPoly2);
Integer nPolyLong = max(nPoly1, nPoly2);
Real[nPolyShort] polyShort;
Real[nPolyLong] polyLong;
Real[nPolyLong] polyDiff;
algorithm
if (nPoly1<nPoly2) then
polyShort := poly1;
polyLong := poly2;
else
polyShort := poly2;
polyLong := poly1;
end if;
polyDiff := polyLong;
for i in 0:nPolyShort-1 loop
polyDiff[nPolyLong-i] := polyLong[nPolyLong-i] - polyShort[nPolyShort-i];
end for;
intersect := Modelica.Math.Vectors.Utilities.roots(polyDiff);
end polyIntersect;
上面的代码也可以在这里找到:https://gist.github.com/thorade/5388205