Показать сообщение отдельно
Старый 11.01.2019, 12:19   #3 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,152
Сказал(а) спасибо: 281
Поблагодарили 504 раз(а) в 162 сообщениях
Репутация: 91497
По умолчанию

Уважаемый участник, тогда, почти 7 лет назад, я, должен признаться, несколько схалтурил: воспользовался простотой системы и свёл её к простому уравнению, каковое и решил методом Ньютона. В принципе, можно и здесь поступить также, но давайте всё же решим задачу, как положено.
Для этого нам понадобится вычислять:
1. Сами функции
f1 = 2y + x -1
f2 = 0.2y² + x +1

2. Их частные производные по обеим переменным
f1Dx = 1
f1Dy = 2
f2Dx = 1
f2Dy = 0.4y

3. Якобиан системы Jac. Это определитель второго порядка с элементами
a11 = f1Dx
a12 = f1Dy
a21 = f2Dx
a22 = f2Dy

4. X-определитель (Dx) с элементами
a11 = f1
a12 = f1Dy
a21 = f2
a22 = f2Dy

5. Y-определитель (Dy) с элементами
a11 = f1Dx
a12 = f1
a21 = f2Dx
a22 = f2

Тогда решение системы находится с помощью итерационной процедуры
Xk+1 = Xk - Dx(Xk,Yk)/Jac(Xk,Yk)
Yk+1 = Yk - Dy(Xk,Yk)/Jac(Xk,Yk)
где k – номер итерации.

Теперь сама программа и результат:
Код:
Const
 eps=0.001;

Var
 XX,YY:real;

function f1(x,y:real):real;
begin
 f1:=y*2+x-1.0;
end;

function f2(x,y:real):real;
begin
 f2:=0.2*y*y+x-1.0;
end;

function f1Dx(x,y:real):real;
begin
 f1Dx:=1.0;
end;

function f1Dy(x,y:real):real;
begin
 f1Dy:=2.0;
end;

function f2Dx(x,y:real):real;
begin
 f2Dx:=1.0;
end;

function f2Dy(x,y:real):real;
begin
 f2Dy:=0.4*y;
end;

function Det(a11,a12,a21,a22:real):real;
begin
 Det:=a11*a22-a12*a21;
end;

function Jac(x,y:real):real;
begin
 Jac:=Det(f1Dx(x,y),f1Dy(x,y),f2Dx(x,y),f2Dy(x,y));
end;

function Dx(x,y:real):real;
begin
 Dx:=Det(f1(x,y),f1Dy(x,y),f2(x,y),f2Dy(x,y));
end;

function Dy(x,y:real):real;
begin
 Dy:=Det(f1Dx(x,y),f1(x,y),f2Dx(x,y),f2(x,y));
end;

Procedure Solve(x0,y0:real; var x1:real; var y1:real);
Var
 Xold,Yold,Xnew,Ynew,DDx,DDy:real;
begin
 Xold:=x0;
 Yold:=y0;
 repeat
  Xnew:=Xold-Dx(Xold,Yold)/Jac(Xold,Yold);
  Ynew:=Yold-Dy(Xold,Yold)/Jac(Xold,Yold);
  DDx:=Abs(Xnew-Xold);
  DDy:=Abs(Ynew-Yold);
  Xold:=Xnew;
  Yold:=Ynew;
 until (DDx<eps) and (DDy<eps);
 x1:=Xnew;
 y1:=Ynew;
end;

Begin
 Solve(-20.0,9.0,XX,YY);
 Writeln(' x1 = ',XX:7:3);
 Writeln(' y1 = ',YY:7:3);
 Writeln;
 Solve(0.0,1.0,XX,YY);
 Writeln(' x2 = ',XX:7:3);
 Writeln(' y2 = ',YY:7:3);
 Readln
End.
P.S. Что касается простого уравнения, которое надлежит решить методом половинного деления, то я Вас адресую сюда:
К вопросу о численном решении алгебраических уравнений
Там всё расписано весьма подробно.
Изображения
 
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070