Консультация № 159896
08.02.2009, 02:52
100.00 руб.
0 4 0
Доброго времени суток, уважаемые эксперты!
Требуется реализовать метод простой итерации для решения нелинейной системы состоящей из семи уравнений. Вот такой:

x[0]=x[1]^3+x[2]-x[3]+2x[5]+x[6]-13
x[1]=10x[0]-x[2]+x[3]+100x[4]^2-x[5]-x[6]+6
x[2]=x[0]^2+x[1]+x[3]+x[4]+x[5]+x[6]-2
x[3]=x[0]-x[1]-x[2]+x[4]^2+x[5]-x[6]+2
x[4]=x[0]^2+2x[1]-2x[2]-x[3]+x[5]+x[6]-5
x[5]=4x[0]^2+2x[1]+2x[2]-4x[3]+5x[4]-x[6]-8
x[6]=5x[0]+5x[1]-3x[2]+4x[3]-x[4]^2+x[5]-3

корни системы уравнений:
x[0]=0
x[1]=2
x[2]=1
x[3]=-1
x[4]=0
x[5]=1
x[6]=1

И есть еще другие корни...

Ниже приведены 2 модуля. Код необходимо дописать в методе "tsolver.SolveByIterations" с использованием при необходимости метода "tSolver.OneStep_iterations" в модуле MainClass2.



Приложение:
unit MainClass2;



interface
type

TArray = array of extended;
TArrayArray = array of array of extended;
///Объявляю функцию, которая будет представлять собой систему уравнений, которую надо решить.
/// х=F(x)
TEquations = function (arg:TArray):TArray;


TSolver = class
private
{ Private declarations }
///Функция правых частей.
F:TEquations;
///Переменные системы
x: TArray;

///Один шаг итераций. Пример использования см в коде
function OneStep_Iterations(old:tarray; n:integer):tarray;
function OneStep_Newton(old:tarray; n:integer):tarray;


public
{ Public declarations }
///Конструктор класса. При создании класса, задаем и систему решаемых уравнений.
constructor Create(Eqs:TEquations);
/// Установка начального приближения и параметров системы
procedure SetInit(x0:tarray);
/// Ниже - все функии решения системы от начала до конца. в результате выдается
/// массив с решением
function SolveByIterations(n:integer):Tarray;
function SolveByNewton(n:integer):Tarray;
function SolveByDownstep():Tarray;
end;

implementation

constructor TSolver.Create(Eqs: TEquations);
begin
F:=Eqs;
end;

procedure Tsolver.SetInit(x0: TArray);
var
i:integer;
begin
Setlength(x,length(x0));
for I := 0 to length(x0) - 1 do
x[i]:=x0[i];


end;

function tSolver.OneStep_iterations(old: TArray; n:integer):tarray;
var k:extended;
tmp,tmp2:tarray;
i,j:integer;
begin

k:=-0.01;


setlength(tmp,n);
setlength(tmp2,n);
tmp2:=F(old);

for i:=0 to n-1 do
tmp[i]:=old[i]+k*(old[i]-tmp2[i]);


//здесь необходимо дописать код



OneStep_iterations:=tmp;
end;


function tsolver.SolveByIterations(n:integer):tarray;
var
i:integer;
tmp2,tmp:tarray;
indikator:boolean;

function Fau(tmp: TArray):extended;
var
i:integer;
begin
result:=0;
for I:=0 to length(x)-1 do
result:=result+sqr(tmp[i]-x[i]);
result:=sqrt(result);
end;

begin

setlength(tmp,length(x));
for I:=0 to length(x)-1 do
tmp[i]:=x[i];


tmp:=OneStep_iterations(tmp,n);

//здесь необходимо дописать код!!!

SolvebyIterations:=tmp;
end;


end.

---------------------------------------------------------------------------------------------------------------------
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,MainClass2, StdCtrls, Math;
const max=7;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Label1: TLabel;
Label2: TLabel;
GroupBox1: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
GroupBox2: TGroupBox;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label17: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//result:tarray;
implementation

{$R *.dfm}

///Тут задается система уравнений, которую требуется решить
///в данном случае уравнения вида: х=F(x)
function Equations(arg:TArray):TArray;
var
return: tarray;
begin
{try}
setlength(return,max);
return[0]:=exp(3*ln(arg[1]))+arg[2]-arg[3]+sqr(arg[4])+2*arg[5]+arg[6]-13;
return[1]:=10*arg[0]-arg[2]+arg[3]+100*sqr(arg[4])-arg[5]-arg[6]+6;
return[2]:=sqr(arg[0])+arg[1]+arg[3]+arg[4]+arg[5]+arg[6]-2;
return[3]:=arg[0]-arg[1]-arg[2]+sqr(arg[4])+arg[5]-arg[6]+2;
return[4]:=sqr(arg[0])+2*arg[1]-2*arg[2]-arg[3]+arg[5]+arg[6]-5;
return[5]:=4*sqr(arg[0])+2*arg[1]+2*arg[2]-4*arg[3]+5*arg[4]+5*arg[4]-arg[6]-8;
return[6]:=5*arg[0]+5*arg[1]-3*arg[2]+4*arg[3]-sqr(arg[4])+arg[5]-3;
//ответ для такой системы: [0,2,1,-1,0,1,1]


Equations:=return;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
Solver:Tsolver;
x:tarray;
i:integer;
a:array[0..max-1] of string;
begin
///устанавливаем размерность решаемых нами систем
setlength(x,max);
Randomize();
//заполняем массивы параметров и начального приближения


x[0]:=-0.75+(random()/2);
x[1]:=1.75+(random()/2);
x[2]:=0.75+(random()/2);
x[3]:=-1.25+(random()/2);
x[4]:=-0.25+(random()/2);
x[5]:=0.75+(random()/2);
x[6]:=0.75+(random()/2);



///Задаем систему уравнений
Solver:=TSolver.Create(Equations);
///Устанавливаем параметры и начальное приближение
Solver.SetInit(x);
///Решаем систему, результат пишем в х
for I := 0 to max-1 do
begin
a[i]:=floattostr(x[i]);
listbox1.Items.add('x['+floattostr(i)+']='+a[i]);
end;

if RadioButton1.checked=true then
x:=Solver.SolveByIterations(max);
if RadioButton2.Checked=true then
x:=Solver.SolveByNewton(max);
if RadioButton3.Checked=true then
x:=Solver.SolveByDownstep();

for I := 0 to max-1 do
begin
a[i]:=floattostr(x[i]);
listbox2.Items.add('x['+floattostr(i)+']='+a[i]);
end;
end;

end.

Обсуждение

Неизвестный
08.02.2009, 03:26
общий
Очень хотелось бы, чтобы задача была решена за первую половину дня воскресенья:)
Если нужны исходные файлы, обращайтесь. Вышлю на почту, ибо не знаю можно ли их здесь как-нибудь прикрепить...
Неизвестный
08.02.2009, 05:08
общий
Первому, кто выполнит задание, положу на счёт WebMoney 100WMR в знак уважения и благодарности.(напишите, пожалуйста, номер вашего рублевого кошелька в личном сообщении)
Неизвестный
08.02.2009, 15:41
общий
кто-нибудь возьмётся за задание?
Неизвестный
09.02.2009, 15:48
общий
Назовите свою цену за задание
Форма ответа