2013-04-09 54 views
1

林与Dymola的版本2013年工作的全零,如:找到我试图解决一个简单的数学问题polynomal功能

f= x^2 -4 ; 
y=1; 
f=y; 

f和X定义为实。解决方案是2.36。但我需要用这两种解决方案进行计算。所以2.36和-2.36! 在我的问题f是一个多项式,如ax^3 + bx^2 + cx + d 和y是线性的。 y = ax + b

如何获得此问题的所有解决方案? x没有明确的价值。 x通常至少有两个解决方案。 x应该是一个向量吗?在这种情况下,我遇到了方程的维数问题... 有人可以帮助我吗?

+0

你已经来看看'Modelica.Math.Vectors.Utilities.roots'?这是计算多项式根的函数。如果有帮助,你应该在这里写一个简短的例子作为自我回答。 – matth 2013-04-14 15:40:17

回答

1

如果我理解正确,您的目标是使用Modelica来查找(高于二阶)多项式的所有根。恐怕Modelica的目的不在于此。对于给定的非线性方程,Modelica模型的模拟将使用(至多)非线性方程的一个根。如果你想找到所有的根,你必须找到一种方法来自己分解多项式。在你的情况下,你只处理一个三次多项式,所以你应该研究用于分解三次多项式的算法。然后,您可以将这样的算法编写为Modelica函数。

0

正如我理解你的问题,你有两个多项式,并希望找到它们相等的所有点。
这是一个函数,它使用Modelica.Math.Vectors.Utilities.roots
首先,你给出两个多项式poly1poly2。查找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

相关问题