1

我正在使用 Dymola 2013 版。我尝试解决一个简单的数学问题,例如:

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 应该是一个向量吗?在这种情况下,我遇到了方程维数的问题......有人可以帮助我吗?

4

2 回答 2

1

据我了解您的问题,您有两个多项式,并希望找到它们相等的所有点。
这是一个使用 执行此操作的函数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

于 2013-04-15T13:54:11.407 回答
1

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

于 2013-04-10T14:06:10.827 回答