Разложение рациональной дроби на простейшие.
Реферат - Математика и статистика
Другие рефераты по предмету Математика и статистика
о пишем дальше:
> 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;