2013-04-09 8 views
1

임 Dymola 버전 2013로 작업 polynomal 기능의 모든 0을, 찾을 수 있습니다. 해는 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를 사용하여 (2 차 이상) 다항식의 모든 뿌리를 찾아내는 것이 목표입니다. 나는 Modelica가 의도 한 것이 아니라는 것에 두려워합니다. 주어진 비선형 방정식에 대해 Modelica 모델의 시뮬레이션은 비선형 방정식의 한 가지 근원 (최대)을 사용합니다. 모든 근원을 찾으려면 다항식을 직접 계산할 수있는 방법을 찾아야합니다. 귀하의 경우에는 3 차 다항식 만 다루므로 3 차 다항식을 인수 분해하기위한 알고리즘을 연구해야합니다. 그런 다음 Modelica 함수와 같은 알고리즘을 작성할 수 있습니다.

0

나는 두 다항식을 가지고 있고 그들이 같은지 모든 점을 찾고 싶다.
여기에 Modelica.Math.Vectors.Utilities.roots을 사용하는 함수가 있습니다.
먼저 두 개의 다항식 poly1poly2을 입력합니다. poly1=poly2을 찾는 것은 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