Разложение рациональной дроби на простейшие.

Реферат - Математика и статистика

Другие рефераты по предмету Математика и статистика

о пишем дальше:

 

 

> b:= collect(fracpart, x):

(а) > for i from 0 to degree(f, x) do

> cdef[i]:= coeff(b, x, i):

> od:

 

 

Снова собрали в cdef i коэффициенты при x i , но уже из fracpart (определенные). Внимание на (а) их должно быть столько же, сколько и в первом наборе, иначе система не получится. Сформируем набор переменных ( A k- ые), относительно которых будем решать нашу систему и ее саму:

 

 

vars:={seq(A[k],k=1..lastvar-1)}:">> vars:= {seq(A[k], k=1..lastvar-1)}:

> eqns:= {seq(cundef[i]=cdef[i], i=0.. degree(f, x))}:

> assign(solve(eqns, vars));

 

 

Последняя строка заставит Maple пошевелить мозгами, решить нашу систему относительно наших переменных. Функция solve требует два параметра: первый это набор уравнений, второй набор переменных. Результат работы будет представлен в виде опять же набора равенств. На этом этапе присвоения переменным, относительно которых решалась система, вычисленных значений не происходит. Чтобы это все-таки сделать, воспользуемся функцией assign в качестве параметра, которой передается набор равенств. Таким образом вычислены наши неопределенные A k -ые. Так как rxn через них выражается, то на результат можно посмотреть так (см. рисунок):

 

> zpart + rxn;

 

Это и есть разложение нашей rfun на сумму простейших дробей.

 

> simplify(zpart + rxn rfun);

 

осуществит проверку тождественности (функция simplify как можно дальше упростит выражение), возвратив 0. Другого и не должно быть, в противном случае алгоритм сработал некорректно, чего я от него никак не жду.

Приведенный пример лишний раз доказывает, что система Maple никак не является просто символьным калькулятором. В отличие от MathCad, где возможности программирования представлены не на высшем уровне, она позволяет реализовывать самые буйные фантазии по части построения сложнейших алгоритмов.

 

 

“Реализация метода простых коэффициентов на Delphi”.

Листинг:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Spin, StdCtrls, Grids, MatUtilits;

 

type

signs = -1..1;

polinom = array of real;

fpolinoms = array of polinom;

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

StringGrid2: TStringGrid;

Edit2: TEdit;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

Button1: TButton;

Memo1: TMemo;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Edit4: TEdit;

procedure Button1Click(Sender: TObject);

procedure SpinEdit1Change(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure FormCreate(Sender: TObject);

 

private

{ Private declarations }

public

{ Public declarations }

procedure Polinommul(a:polinom;n:byte;b:polinom;m:byte;var ab:polinom;var nm:byte);

procedure GetPolinom(r:fpolinoms;step:byte;flag:boolean;numdrob:byte;var res:polinom);

procedure Calculate(mass1:polinom;n:integer;var formula:string);

end;

const

n10 =10;

var

Form1: TForm1;

n1,n2,s1,s2:shortint;

roots1,roots2,znamen,matr:fpolinoms;

pol1,pol2,chislit:polinom;

matr1,koef:matdouble;

mass1:array of real;

elem:array[0..n10] of string[10];

equation,eq1,eq2,eq3:string;

implementation

 

{$R *.dfm}

 

 

 

 

Процедура перемножения объектов типа polinom, т. е. массивов с коэффициентами многочленов и получения результата их перемножения:

 

procedure TForm1.Polinommul(a:polinom;n:byte;b:polinom;m:byte;var ab:polinom;var nm:byte);

var

temp:real;

i,j,t:shortint;

p1:polinom;

begin

setlength(p1,m+n+1);

setlength(ab,m+n+1);

temp:=0;

for i:=0 to m+n do p1[i]:=0;

for i:=0 to n do

for j:=0 to m do

begin

temp:=a[i]*b[j];

p1[i+j]:=p1[i+j]+temp;

end;

nm:=n+m;

ab:=p1;

{ t:=0;

for i:=0 to m+n do

if p1[i]=0 then

begin

t:=i+1;

continue;

end

else break;

setlength(ab,m+n-t);

for i:= 0 to m+n-t+1 do

ab[i]:=p1[i+t];

nm:=m+n-t+1; }

end;

 

 

Процедура, которая из массива многочленов делает многочлен или результат их перемножения или произведение, но без i-го члена, в зависимости от flag.

 

procedure TForm1.GetPolinom(r:fpolinoms;step:byte;flag:boolean;numdrob:byte;var res:polinom);

var

buffer,buffer1,temp:polinom;

i,j,p,p1:byte;

flag1:boolean;

begin

if not(flag) then

begin

setlength(buffer,2);

setlength(buffer1,2);

setlength(temp,2);

buffer[0]:=r[0,0];

buffer[1]:=r[0,1];

p:=1;

p1:=1;

for i:=1 to step do

begin

setlength(temp,p1+1);

for j:=0 to 1 do buffer1[j]:=r[i,j];

Form1.Polinommul(buffer,p,buffer1,1,temp,p1);

setlength(buffer,p1);

buffer:=temp;

p:=p1;

end;

end

else

begin

setlength(buffer,2);

setlength(buffer1,2);

setlength(temp,2);

buffer[0]:=0;

buffer[1]:=1.0;

p:=0;

p1:=0;

for i:=0 to step do

begin

if numdrob = i then

begin

buffer1[0]:=0;

buffer1[1]:=1.0;

end;

if numdrob<>i then inc(p);

if numdrob<>i then for j:=0 to 1 do buffer1[j]:=r[i,j];

if numdrob=i then

begin

Form1.Polinommul(buffer,p,buffer1,1,temp,p1);

continue;

end;

Form1.Polinommul(buffer,p,buffer1,1,temp,p1);

if numdrob<>i then setlength(buffer,p1);

buffer:=temp;

end;

end;

 

setlength(res,p1);

res:=buffer;

end;

 

 

Основной текст программы, вбирающий в себя процедуры и реализовающий сам процесс разложения на простые множители. Его я повесил на кнопку:

 

 

procedure TForm1.Button1Click(Sender: TObject);

var

i,j,k:byte;

temp:polinom;

st1,st2,st3,stt:string;

begin

Form1.Edit1.Text:=;

Form1.Edit2.Text:=;

Form1.Edit3.Text:=;

Form1.Edit4.Text:=;

n1:=strtoint(Form1.SpinEdit1.Text);

n2:=strtoint(Form1.SpinEdit2.Text)-1;

setlength(chislit,n1+1);

setlength(roots2,n2+1,2);

setlength(znamen,n2,n2);

for i:=0 to n1 do

begin

chislit[i]:=strtofloat(Form1.StringGrid1.Cells[i,0]);

end;

for i:=0 to n2 do

begin

roots2[i,0]:=1.0;

roots2[i,1]:=-strtofloat(Form1.StringGrid2.Cells[i,0]);

end;

form1.GetPolinom(roots2,n2,false,0,pol2);

setlength(temp,n2+1);

for i:=0 to n2 do

begin

for k:=0 to n2 do temp[k]:=0;

form1.GetPolinom(roots2,n2,true,i,temp);

for j:=0 to n2 do

Form1.Edit3.Text:= Form1.Edit3.Text+getfstring(temp[j+1],1)+ ;

for k:=0 to n2 do temp[k]:=0;

end;