2013-04-09 3 views
1

Im работая с Dymola версией 2013. я пытаюсь решить простую математическую задачу, как:найти все нули функции полиномиальной

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

е и х определяются как Real. Решение равно 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

ответ

1

Если вы правильно поняли, ваша цель - использовать Modelica для поиска всех корней полинома (более высокого, чем второго порядка). Я боюсь, что это не то, для чего предназначен Modelica. Для заданных нелинейных уравнений моделирование модели Modelica будет использовать (не более) один корень нелинейного уравнения. Если вы хотите найти все корни, вам нужно будет найти способ самостоятельно определять полином. В вашем случае вы имеете дело только с кубическим полиномом, поэтому вам следует исследовать алгоритмы факторизации кубических полиномов. Затем вы можете написать такой алгоритм, как функция Modelica.

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