Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 09.01.2019, 20:16   #1 (permalink)
xamelione25
Новичок
 
Регистрация: 09.01.2019
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Найти корни нелинейного уравнения методами половинного деления, и по Ньютону

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

(см. скрин)
Миниатюры
screenshot_1.jpg  
xamelione25 вне форума   Ответить с цитированием

Старый 09.01.2019, 20:16
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Не оставляйте без внимание схожие ссылки

Решить уравнение методом половинного деления
Паскаль. Метод половинного деления
Решение нелинейного уравнения методом деления отрезка пополам
Паскаль. Найти корни уравнения методом хорд

Старый 10.01.2019, 12:02   #2 (permalink)
xamelione25
Новичок
 
Регистрация: 09.01.2019
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Я сделал все как в посте №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.
Миниатюры
screenshot_2.jpg   screenshot_3.jpg  
xamelione25 вне форума   Ответить с цитированием
Старый 11.01.2019, 12:19   #3 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 25,712
Сказал(а) спасибо: 265
Поблагодарили 491 раз(а) в 156 сообщениях
Репутация: 85380
По умолчанию

Уважаемый участник, тогда, почти 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. Что касается простого уравнения, которое надлежит решить методом половинного деления, то я Вас адресую сюда:
К вопросу о численном решении алгебраических уравнений
Там всё расписано весьма подробно.
Миниатюры
aa01.jpg  
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 11.01.2019, 14:19   #4 (permalink)
xamelione25
Новичок
 
Регистрация: 09.01.2019
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
-20.0,9.0,XX,YY
0.0,1.0,XX,YY[/CODE]
У меня вопрос что значат эти две строки......особенно я не пойму откуда берутся XX и YY - из какой строки строки программа берет их значения. Я просто в упор не вижу где они вычисляются
И что значит -20 и 9; 0 и 1
xamelione25 вне форума   Ответить с цитированием
Старый 11.01.2019, 16:05   #5 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 25,712
Сказал(а) спасибо: 265
Поблагодарили 491 раз(а) в 156 сообщениях
Репутация: 85380
По умолчанию

Цитата:
Сообщение от xamelione25 Посмотреть сообщение
У меня вопрос что значат эти две строки......особенно я не пойму откуда берутся XX и YY - из какой строки строки программа берет их значения.
Это глобальные параметры программы, задаются в разделе Var в самом начале. Их значения вычисляются в процедуре Solve. Там в шапке указаны выходные параметры x1, y1. При обращении к процедуре на их место подставляются XX и YY. А представляют они собой конечное решение задачи (корни системы).
Цитата:
Сообщение от xamelione25 Посмотреть сообщение
И что значит -20 и 9; 0 и 1
Просто некие стартовые значения в окрестности ожидаемых корней.
Обратите внимание (и в моём эссе по ссылке, и в других источниках), что численное решение уравнений или систем, в особенности методом Ньютона, должно начинаться с неких стартовых ожидаемых значений где-то поблизости от реальных корней. Вот это они и есть.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.