1

Dymola バージョン 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 には多くの場合、少なくとも 2 つの解があります。x はベクトルであるべきですか? この場合、方程式の次元に問題がありました...誰か助けてくれますか?

4

2 に答える 2

1

あなたの質問を理解したように、2 つの多項式があり、それらが等しいすべての点を見つけたいと考えています。
を使用してこれを行う関数を次に示しModelica.Math.Vectors.Utilities.rootsます。
まず、2 つの多項式poly1と を指定しpoly2ます。Findpoly1=poly2は Find と同じなpoly1-poly2=0ので、3 番目の多項式を定義して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 からも入手できます。

于 2013-04-15T13:54:11.407 に答える