Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Найти корни нелинейного уравнения методами половинного деления, и по Ньютону (http://www.tehnari.ru/f43/t262446/)

xamelione25 09.01.2019 20:16

Найти корни нелинейного уравнения методами половинного деления, и по Ньютону
 
Вложений: 1
Помогите поставить программу для нахождения корней
1. Нелинейного уравнения
lgx+x^2=0 - Методом половинного деления
и
2. Системы двух нелинейных уравнений
2*y+x-1=0 - Методом Ньютона
с точностью ε=0.001
заранее выполнив отделение корней уравнений.

(см. скрин)

xamelione25 10.01.2019 12:02

Вложений: 2
Я сделал все как в посте №2... но у меня вылетели почему-то не правильные ответы

Код:

Const
 e=0.0001;
Var
 x_old, x_new, y, z:real;

Function Fun_1(x:real):real;
begin
 Fun_1:=(2*sqrt(5/(1-x)))+x-1;
end;

Function Fun_2(x:real):real;
begin
 Fun_2:=(-2*sqrt(5/(1-x)))+x-1;
end;

Function Der_1(x:real):real;
begin
 Der_1:=sqrt(5)*power((1/(1-x)), (3/2))+1;
end;

Function Der_2(x:real):real;
begin
 Der_2:=1-sqrt(5)*power((1/(1-x)), (3/2));
end;

Begin   
 x_old:=-1.5;
 Repeat
  z:=x_old;
  x_new:=x_old-Fun_1(x_old)/Der_1(x_old);
  x_old:=x_new;
 Until Abs(x_old-z)<e;
 y:=-Sqrt(5*(1-x_old));
 Writeln('x1= ',x_old:0:5);
 Writeln('y1= ',y:0:5);
 Writeln;
 x_old:=1.5;
 Repeat
  z:=x_old;
  x_new:=x_old-Fun_2(x_old)/Der_2(x_old);
  x_old:=x_new;
 Until Abs(x_old-z)<e;
 y:=Sqrt(5*(1-x_old));
 Writeln('x2= ',x_old:0:5);
 Writeln('y2= ',y:0:5);
 Readln;
End.


Vladimir_S 11.01.2019 12:19

Вложений: 1
Уважаемый участник, тогда, почти 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. Что касается простого уравнения, которое надлежит решить методом половинного деления, то я Вас адресую сюда:
http://www.tehnari.ru/f41/t95695/
Там всё расписано весьма подробно.

xamelione25 11.01.2019 14:19

Цитата:

Сообщение от Vladimir_S (Сообщение 2621715)
-20.0,9.0,XX,YY
0.0,1.0,XX,YY[/CODE]

У меня вопрос что значат эти две строки......особенно я не пойму откуда берутся XX и YY - из какой строки строки программа берет их значения. Я просто в упор не вижу где они вычисляются
И что значит -20 и 9; 0 и 1

Vladimir_S 11.01.2019 16:05

Цитата:

Сообщение от xamelione25 (Сообщение 2621750)
У меня вопрос что значат эти две строки......особенно я не пойму откуда берутся XX и YY - из какой строки строки программа берет их значения.

Это глобальные параметры программы, задаются в разделе Var в самом начале. Их значения вычисляются в процедуре Solve. Там в шапке указаны выходные параметры x1, y1. При обращении к процедуре на их место подставляются XX и YY. А представляют они собой конечное решение задачи (корни системы).
Цитата:

Сообщение от xamelione25 (Сообщение 2621750)
И что значит -20 и 9; 0 и 1

Просто некие стартовые значения в окрестности ожидаемых корней.
Обратите внимание (и в моём эссе по ссылке, и в других источниках), что численное решение уравнений или систем, в особенности методом Ньютона, должно начинаться с неких стартовых ожидаемых значений где-то поблизости от реальных корней. Вот это они и есть.


Часовой пояс GMT +4, время: 16:14.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.