Vladimir_S |
02.12.2015 10:31 |
Вложений: 1
Цитата:
Сообщение от ahristovsky
(Сообщение 1183775)
Система нелинейных уравнений имеет заранее неизвестное число решений. Пользуясь методом Ньютона найти все решения.
Система:
y = x^2 - 1
y = 6x - 7
Язык Паскаль. Заранее большое спасибо! tehnoyxi
|
Да пожалуйста, как нефиг делать!
Прежде всего заметим, что система благополучно решается аналитически. Вот с этого и начнем. В результате получим
x1 = 3 + (√3) ≈ 4.7320508
y1 = 11 + (√3)*6 ≈ 21.3923048
x2 = 3 - (√3) ≈ 1.2679492
y2 = 11 - (√3)*6 ≈ 0.6076952
Теперь будем решать численно. Для этого нам понадобится задать точность (возьмем 0.00001) и стартовые приближенные значения решений. Их мы зададим, например, так:
x01 = 5.0
y01 = 20.0
x02 = 1.0
y02 = 0.0
Код:
Const
x01=5.0;
y01=20.0;
x02=1.0;
y02=0.0;
Eps=0.00001;
Type
Matr=Array[1..2,1..2] of Real;
Var
x,y,dx,dy,Det_0,Det_X,Det_Y:Real;
M:Matr;
Function Determ(D:Matr):Real;
begin
Determ:=D[1,1]*D[2,2]-D[1,2]*D[2,1];
end;
Function f1(z1,z2:real):Real;
begin
f1:=Sqr(z1)-z2-1;
end;
Function f2(z1,z2:real):Real;
begin
f2:=z1*6-z2-7;
end;
Function Der_x_f1(z1,z2:real):Real;
begin
Der_x_f1:=z1*2;
end;
Function Der_y_f1(z1,z2:real):Real;
begin
Der_y_f1:=-1.0;
end;
Function Der_x_f2(z1,z2:real):Real;
begin
Der_x_f2:=6.0;
end;
Function Der_y_f2(z1,z2:real):Real;
begin
Der_y_f2:=-1.0;
end;
Begin
x:=x01;
y:=y01;
Repeat
M[1,1]:=Der_x_f1(x,y);
M[1,2]:=Der_y_f1(x,y);
M[2,1]:=Der_x_f2(x,y);
M[2,2]:=Der_y_f2(x,y);
Det_0:=Determ(M);
M[1,1]:=-f1(x,y);
M[2,1]:=-f2(x,y);
Det_X:=Determ(M);
M[1,1]:=Der_x_f1(x,y);
M[1,2]:=-f1(x,y);
M[2,1]:=Der_x_f2(x,y);
M[2,2]:=-f2(x,y);
Det_Y:=Determ(M);
dx:=Det_X/Det_0;
dy:=Det_Y/Det_0;
x:=x+dx;
y:=y+dy;
Until (Abs(dx)<Eps) and (Abs(dy)<Eps);
Writeln('x1 = ',x:0:6);
Writeln('y1 = ',y:0:6);
Writeln;
x:=x02;
y:=y02;
Repeat
M[1,1]:=Der_x_f1(x,y);
M[1,2]:=Der_y_f1(x,y);
M[2,1]:=Der_x_f2(x,y);
M[2,2]:=Der_y_f2(x,y);
Det_0:=Determ(M);
M[1,1]:=-f1(x,y);
M[2,1]:=-f2(x,y);
Det_X:=Determ(M);
M[1,1]:=Der_x_f1(x,y);
M[1,2]:=-f1(x,y);
M[2,1]:=Der_x_f2(x,y);
M[2,2]:=-f2(x,y);
Det_Y:=Determ(M);
dx:=Det_X/Det_0;
dy:=Det_Y/Det_0;
x:=x+dx;
y:=y+dy;
Until (Abs(dx)<Eps) and (Abs(dy)<Eps);
Writeln('x2 = ',x:0:6);
Writeln('y2 = ',y:0:6);
Readln
End.
Ну и вот результат:
Вложение 252237
|