IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Решение линейного алгебраического уравнения, Метод итераций
сообщение
Сообщение #1


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Суть задания:
Решить линейное алгебраическое уравнение второго порядка( я взял 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.

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Написал код программы который решает методом итераций но я точно незнаю этот ли метод использую в коде
Метод в любом случае не тот, тебе надо решать систему уравнений, ты решаешь одиночное уравнение. Вот тут почитай про решение СЛАУ методом простой итерации:
Методы простых итераций и Зейделя (там в самом верху есть ссылка на оригинальный DOC-файл).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Самое интересное что у меня ведь не система линейных алгебраических уравнений а одно всего лишь уравнение.

У меня вопрос. Может ли квадратное уравнение решаться методом итераций???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


А какой точно метод итераций?

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Помогите в этом коде отделить метод итераций от зейделя не понимаю как вообще она работает

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


не понятно точно какое уровнение ты написал в начале либо 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.

Работать будет только для упомянутого уравненияsmile.gif
Два корня с точностю 10E-8
Метод Ньютона со смекалкой))))

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name