2013-04-09 31 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