Новости :

Решение уравнений различных степеней


Материал подготовил(и): volvo

Очень часто при решении задач необходимо находить корни уравнений различных порядков (квадратных, кубических и т.д.) Вместо того, чтобы писать свое решение этой задачи, можно воспользоваться функциями, которые содержатся в присоединенном модуле Equation:


Код
Function solveQuadratic(Var x, y: Array Of Double): Byte;

Решение квадратного уравнения вида:
QUOTE
x[0] * x^2 + x[1] * x + x[2] = 0
Результат, возвращаемый функцией - количество действительных корней (cами корни возвращаются в y[0], y[1]).

Пример использования:
CODE
{$n+}
Uses Equation;
Const
 ax: Array[0 .. 2] Of Double =
       (24, -50, 25 );
Var
 ay: array[0 .. 2] Of Float;
 roots, i: Integer;

Begin
 roots := solveQuadratic(ax, ay);
 Writeln( 'number of roots = ', roots );
 For i := 0 To Pred(roots) Do
   WriteLn( 'root #', i + 1, ' = ', ay[i]:10:5 );
End.



Код
Function solveCubic(Var x, y: Array Of Double): Byte;

Решение кубического уравнения:
QUOTE
x[0] * x^3 + x[1] * x^2 + x[2] * x + x[3] = 0
Результат, возвращаемый функцией - количество действительных корней (сами корни возвращаются в y[0], y[1], y[2]).

Пример использования:
CODE
{$n+}
Uses Equation;
Const
 ax: Array[0 .. 3] Of Float =
       (1, 0, -9, 4 );
Var
 ay: array[0 .. 3] Of Float;
 roots, i: Integer;

Begin
 roots := solveCubic(ax, ay);
 Writeln( 'number of roots = ', roots );
 For i := 0 To Pred(roots) Do
   WriteLn( 'root #', i + 1, ' = ', ay[i]:10:5 );
End.



Для решения уравнений 4-ой степени применяются 2 функции
  1. Решение алгебраическим методом (метод Феррари)
    Код
    Function solveQuarticAlgebra(Var x, results: Array Of Double): Byte;
    

  2. Решение по методу Виета (предпочтительно)
    Код
    Function solveQuarticVieta(Var x, results: Array Of Double): Byte;
    
Также в модуль включена функция:
Код
Function PolySolve(Const order: Integer;
Var coeffs, roots: Array Of Double): Integer;

позволяющая решать алгебраические уравнения практически любого порядка (порядок задается константой maxOrder, и изначально установлен равным 12) при помощи последовательности Штурма.

Пример использования (решение уравнения 4-ой степени сначала методом Vieta, а затем - методом Штурма):

CODE
{$n+}
Uses Equation;
Const
 Order = 4;
 coeffs: Array[0 .. Order] Of Double = (
   1, 0, -25, 60, -36
 );

Var
 roots: array[0 .. maxOrder] Of Double;
 nroots, i: Integer;

begin

 WriteLn('Vieta method :');
 nroots := solveQuarticVieta(coeffs, roots);
 { nroots := solveQuarticAlgebra(coeffs, roots); }
 Writeln( 'number of roots = ', nroots );
 For i := 0 To Pred(nroots) Do
   WriteLn( 'root #', i + 1, ' = ', roots[i]:7:4 );

 WriteLn;

 WriteLn('Sturm sequence method :');
 nroots := PolySolve(Order, coeffs, roots);

 If nroots = 0 Then Begin
   WriteLn('solve: no real roots'); Halt(0)
 End
 Else Begin
   WriteLn(nroots, ' distinct real root(s) for x: ');
   For i := 0 To Pred(nroots) Do
     WriteLn('root #', i + 1, ' = ', roots[i]:7:4);
 End;

end.

Материал взят с сайта Всё о Паскале

Комментарии: (0) | Pascal & Delphi | 2006-06-01