• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Найти корни нелинейного уравнения методами половинного деления, и по Ньютону

xamelione25

Ученик
Регистрация
9 Янв 2019
Сообщения
4
Реакции
0
Баллы
0
Найти корни нелинейного уравнения методами половинного деления, и по Ньютону

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

(см. скрин)
 

Вложения

  • Screenshot_1.webp
    Screenshot_1.webp
    22.2 KB · Просмотры: 114
Я сделал все как в посте №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.webp
    Screenshot_2.webp
    25.6 KB · Просмотры: 120
  • Screenshot_3.webp
    Screenshot_3.webp
    5.5 KB · Просмотры: 55
Уважаемый участник, тогда, почти 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/
Там всё расписано весьма подробно.
 

Вложения

  • AA01.webp
    AA01.webp
    3.4 KB · Просмотры: 54
-20.0,9.0,XX,YY
0.0,1.0,XX,YY[/CODE]

У меня вопрос что значат эти две строки......особенно я не пойму откуда берутся XX и YY - из какой строки строки программа берет их значения. Я просто в упор не вижу где они вычисляются
И что значит -20 и 9; 0 и 1
 
У меня вопрос что значат эти две строки......особенно я не пойму откуда берутся XX и YY - из какой строки строки программа берет их значения.
Это глобальные параметры программы, задаются в разделе Var в самом начале. Их значения вычисляются в процедуре Solve. Там в шапке указаны выходные параметры x1, y1. При обращении к процедуре на их место подставляются XX и YY. А представляют они собой конечное решение задачи (корни системы).
И что значит -20 и 9; 0 и 1
Просто некие стартовые значения в окрестности ожидаемых корней.
Обратите внимание (и в моём эссе по ссылке, и в других источниках), что численное решение уравнений или систем, в особенности методом Ньютона, должно начинаться с неких стартовых ожидаемых значений где-то поблизости от реальных корней. Вот это они и есть.
 
Назад
Сверху