Суть задания: Решить линейное алгебраическое уравнение второго порядка( я взял 2*x*x+1*x-3) методом итераций 1. Разработать программу для решения с заданной точностью системы линейных алгебраических уравнений методом итераций; --- ЭТО Я ВРОДЕ КАК СДЕЛАЛ НО НЕЗНАЮ ПРАВИЛЬНО ЛИ???(Листинг проги внизу) 2. Произвести уточнение найденного решения; ----- КАК ЭТО ДЕЛАЕТСЯ НЕЗНАЮ ПОМОГИТЕ ПОЖАЛУЙСТА 3. Оценить погрешности вычислений; --- А КАК ОЦЕНИВАЕТСЯ ПОГРЕШНОСТЬ????? это похоже нужно делать вручную
Написал код программы который решает методом итераций но я точно незнаю этот ли метод использую в коде. Код работает правильно. Но у меня трудность как можно
program piui;
{$APPTYPE CONSOLE} function f(x: real): real;
begin f := 2*x*x+1*x-3; end;
var x, y: real; found: boolean = false;
begin x := -2; while x <= 2 do begin y := f(x); if abs(y) < 0.001 then begin writeln('X = ', X:12:6, ' Y = ', Y:12:6); found := true; end; x := x + 0.0005; end;
if not found then writeln('no roots...'); readln; end.
Написал код программы который решает методом итераций но я точно незнаю этот ли метод использую в коде
Метод в любом случае не тот, тебе надо решать систему уравнений, ты решаешь одиночное уравнение. Вот тут почитай про решение СЛАУ методом простой итерации: Методы простых итераций и Зейделя (там в самом верху есть ссылка на оригинальный DOC-файл).
Помогите в этом коде отделить метод итераций от зейделя не понимаю как вообще она работает
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Grids, Spin; type TForm1 = class(TForm) Panel1: TPanel; Matrix: TStringGrid; SvChlen: TStringGrid; Label1: TLabel; Label2: TLabel; OrderMatrix: TSpinEdit; Label3: TLabel; GroupBox1: TGroupBox; GroupBox2: TGroupBox; KorniMPI: TStringGrid; KorniZeid: TStringGrid; Button1: TButton; Button2: TButton; Button3: TButton; LbNameApos: TLabel; ApostOz: TLabel; Label4: TLabel; LbNameApri: TLabel; ApriorOz: TLabel; Label5: TLabel; LbApostOZeid: TLabel; ApostOzZeid: TLabel; LbNameApriZ: TLabel; ApriorOzZeid: TLabel; procedure OrderMatrixChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Const maxn = 10; type TMyArray=array[0..maxn,0..maxn] of real; type TIterMethod=class It:integer; X:TMyArray; Xnew,Xold,Xold1,XOld2:array[0..maxn] of real; PromMass:array[0..maxn] of real; procedure NormVidMatrix; function Norm(Mat:TMyArray):real; Function Apostr:real; Function Aprior(k:integer):real; Procedure Method_MPI; Procedure Method_Zeidelya; Procedure ShowX(GX:TStringGrid); end; var Form1: TForm1; n:byte; IM:TIterMethod; implementation const MatrixStart:array[0..3,0..3] of real=((4.00,0.09,0.04,0.02), (0.24,3.00,-0.08,0.06), (-0.08,-0.15,4.00,0.04), (0.16,-0.12,0.06,-10.00)); SvChlenStart:array[0..3] of real=(8,9,20,1); E=1E-12; {$R *.dfm} procedure TForm1.OrderMatrixChange(Sender: TObject); var OK:boolean; i,j:byte; begin OK:=n>OrderMatrix.Value; n:=OrderMatrix.Value; Matrix.ColCount:=n; Matrix.RowCount:=n; KorniMPI.RowCount:=n; KorniZeid.RowCount:=n; SvChlen.RowCount:=n; if n<=4 then begin Matrix.DefaultColWidth:=40; Matrix.DefaultRowHeight:=24; end; if (n>4) and (n<7) then begin Matrix.DefaultColWidth:=(Matrix.Width div OrderMatrix.Value)+2; Matrix.DefaultRowHeight:=27; KorniMPI.RowCount:=27; KorniZeid.RowCount:=27; SvChlen.DefaultRowHeight:=27; end; if n>=7 then begin Matrix.DefaultColWidth:=32; Matrix.DefaultRowHeight:=27; KorniMPI.RowCount:=27; KorniZeid.RowCount:=27; SvChlen.DefaultRowHeight:=27; end; if not ok then if n>=4 then begin for i:=0 to n-1 do for j:=4 to n-1 do begin Matrix.Cells[i,j]:=''; SvChlen.Cells[0,j]:=''; end; end; end; //--------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); var i,j:byte; begin DecimalSeparator:='.'; n:=4; for i:=0 to n-1 do for j:=0 to n-1 do begin Matrix.Cells[i,j]:=floattostr(MatrixStart[i,j]); SvChlen.Cells[0,i]:=floattostr(SvChlenStart[i]); end; IM:=TIterMethod.Create; end; //-------------------------------------------------- procedure TForm1.Button3Click(Sender: TObject); begin Application.Terminate; end; //--------------------------------------------------- //вычисление нормального вида матрицы procedure TIterMethod.NormVidMatrix; var i,j:byte; tmp:real; begin for i:=0 to n-1 do begin tmp:=1/strtoFloat(Form1.Matrix.cells[i,i]); j:=0; while j<=n-1 do begin X[i,n]:=tmp*strtofloat(Form1.SvChlen.Cells[0,i]); x[i,j]:=-tmp*strtofloat(Form1.Matrix.Cells[i,j]); X[i,i]:=0; inc(j); end; end; end; //----Вычисление нормы----------------------------- function TIterMethod.Norm(Mat:TMyArray):real; var i,j:byte; sum:real; begin result:=0; for i:=0 to n-1 do begin sum:=0; for j:=0 to n-1 do begin sum:=sum+abs(Mat[i,j]); if sum > Result then Result:=sum; end; end; end; //------------------------------------------------- Procedure TIterMethod.Method_MPI; var l,i,j:byte; sum:real; begin for i:=0 to n-1 do xnew[i]:=X[i,n]; It:=0; Repeat inc(It); for l:=0 to n-1 do xold[l]:=xnew[l]; for i:=0 to n-1 do begin sum:=0;j:=0; while j<=n-1 do begin sum:=sum+X[i,j]*xold[j]; inc(j); end; xnew[i]:=x[i,n]+sum; end; if It=1 then Aprior(It); Until (Apostr-E)<0; end; //----за начальный вектор берется X(0)=0------- Procedure TIterMethod.Method_Zeidelya; var l,i,j:byte; sum:real; begin for i:=0 to n-1 do xnew[i]:=X[i,n]; It:=0; Repeat inc(It); for l:=0 to n-1 do begin xold[l]:=xnew[l]; xold1[l]:=xold[l]; end; for i:=0 to n-1 do begin sum:=0;j:=0; while j<=n-1 do begin sum:=sum+X[i,j]*XOld1[j]; inc(j); end; xnew[i]:=x[i,n]+sum; XOld1[i]:=Xnew[i]; end; if It=1 then Aprior(It); Until (Apostr-E)<0; end; //----Апосториорная оценка---------------------- Function TIterMethod.Apostr:real; var q,dx:real; i:integer; begin q:=Norm(X); dx:=0; for i:=0 to n-1 do if dx<abs(Xold[i]-XNew[i]) then dx:=abs(Xold[i]-XNew[i]); Result:=q/(1-q)*dx; end; //----Априорная оценка-------------------------- Function TIterMethod.Aprior(k:integer):real; var q,Xmax:real; j:integer; Procedure GetMaxX; var i:integer; begin xmax:=0; for i:=0 to n do if xmax<abs((PromMass[i]-Xold2[i])) then xmax:=abs(PromMass[i]-Xold[i]); end; begin result:=1; if k=1 then begin for j:=0 to n-1 do PromMass[j]:=Xnew[j]; XOld2[j]:=XOld[j]; end; GetMaxX; q:=Norm(X); for j:=1 to k do result:=result*q; result:=(result/(1-q))*xmax; end; //---Вычисление результата---------------------- Procedure TIterMethod.ShowX(GX:TStringGrid); var i,j:integer; begin for i:=0 to N do for j:=0 to n do begin GX.Cells[0,j]:=FloatToStr(Xnew[j]); end; end; //---------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var i:byte; begin for i:=0 to n do begin IM.PromMass[i]:=0; IM.Xnew[i]:=0; IM.Xold[i]:=0; end; IM.NormVidMatrix; IM.Method_MPI; IM.ShowX(KorniMPI); ApostOz.Caption:=floattostrf(IM.Apostr,ffFixed,10,12); Form1.ApriorOz.Caption:=floattostrf(IM.Aprior(IM.It),ffFixed,10,12); Label4.Caption:='Количество итераций:'+IntToStr(IM.It); end; procedure TForm1.Button2Click(Sender: TObject); var i:byte; begin for i:=0 to n do begin IM.PromMass[i]:=0; IM.Xnew[i]:=0; IM.Xold[i]:=0; end; IM.NormVidMatrix; IM.Method_Zeidelya; IM.ShowX(KorniZeid); ApostOzZeid.Caption:=floattostrf(IM.Apostr,ffFixed,10,12); Form1.ApriorOzZeid.Caption:=floattostrf(IM.Aprior(IM.It),ffFixed,10,12); Label5.Caption:='Количество итераций:'+IntToStr(IM.It); end; end.
М
Используй теги при публикации кода (Правила, п.5) Lapp
не понятно точно какое уровнение ты написал в начале либо 2*x*x-x-3 либо 2*x*x-1*(x-3) Если первое, то вот что я сделал
uses crt; function kor(x,b,eps:real):real; var y,d_y:real; begin y:=x-((2*sqr(x)-x-3)/(4*x-1)); x:=x+0.0001; d_y:=x-((2*sqr(x)-x-3)/(4*x-1)); while (x<=2) do begin if (abs(d_y-y) < eps) then begin writeln('Корень = ',x:5:5, ' точность= ',abs(d_y-y):5:10); x:=x+0.1; end; y:=d_y; x:=x+0.0001; d_y:=x-((2*sqr(x)-x-3)/(4*x-1)); end; begin clrscr; kor(-2,0,10E-8); readkey; end.
Работать будет только для упомянутого уравнения Два корня с точностю 10E-8 Метод Ньютона со смекалкой))))