Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 19.12.2013, 18:59   #1 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Ошибка в методе Ньютона

Пишет Вещественное деление на 0, сама программа выглядит так:

uses Crt;
var x,a,b,e: real;
function f1(d: real): real;
begin
f1:=(x-2)*(x-2)*2*x-1;
end;
function f2(d:real): real;
begin
f2:=6*x*x-16*x+8;
end;
begin
Clrscr;
a:=0.4;
b:=2;
e:=0.001;
if f1(a)*f2(a)>0 then x:=a
else x:=b;
while abs(f1(x))>e do
begin
x:=x-f1(x)/f2(x);
end;
Writeln ('x=',x,' f(x)=',f1(x));
Readln
end.
felarl вне форума   Ответить с цитированием

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

Тут может содержаться интересующая вас информация

"Колыбель" Ньютона
Метод Ньютона
Решение уравнений методом Ньютона

Старый 19.12.2013, 19:00   #2 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Буду благодарен за помощь!
felarl вне форума   Ответить с цитированием
Старый 19.12.2013, 20:02   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
Буду благодарен за помощь!
Легко. Всё правильно, кроме того, что в ТЕЛЕ обеих функций аргументом должно быть d, а не x. Раз уж в заголовке стоит d. С учетом этого и еще пары мелких поправок:
Код:
uses Crt;

const
 a=0.4;
 b=2;
 e=0.001;

var
 x: real;

function f1(d: real): real;
begin
 f1:=(d-2)*(d-2)*2*d-1;
end;

function f2(d:real): real;
begin
 f2:=6*d*d-16*d+8;
end;

begin
 Clrscr;
 if f1(a)*f2(a)>0 then x:=a else x:=b;
 while abs(f1(x))>e do
  begin
   x:=x-f1(x)/f2(x);
  end;
 Writeln ('x= ',x:0:5,'   f(x)= ',f1(x):0:12);
 Readln
end.
Результат работы программы:
Код:
x= 0.14536           f(x)= -0.000002649617
Vladimir_S вне форума   Ответить с цитированием
Старый 19.12.2013, 20:45   #4 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Легко. Всё правильно, кроме того, что в ТЕЛЕ обеих функций аргументом должно быть d, а не x. Раз уж в заголовке стоит d. С учетом этого и еще пары мелких поправок:
Код:
uses Crt;

const
 a=0.4;
 b=2;
 e=0.001;

var
 x: real;

function f1(d: real): real;
begin
 f1:=(d-2)*(d-2)*2*d-1;
end;

function f2(d:real): real;
begin
 f2:=6*d*d-16*d+8;
end;

begin
 Clrscr;
 if f1(a)*f2(a)>0 then x:=a else x:=b;
 while abs(f1(x))>e do
  begin
   x:=x-f1(x)/f2(x);
  end;
 Writeln ('x= ',x:0:5,'   f(x)= ',f1(x):0:12);
 Readln
end.
Результат работы программы:
Код:
x= 0.14536           f(x)= -0.000002649617
Тааак, извините, могли бы объяснить почему d? что-то я не понимаю...
felarl вне форума   Ответить с цитированием
Старый 19.12.2013, 20:49   #5 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

И еще вопросик, почему х не попадает в заданный интервал?
felarl вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 19.12.2013, 20:57   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
Тааак, извините, могли бы объяснить почему d? что-то я не понимаю...
Потому что так Вы назвали (в шапке функции) формальный параметр. При обращении к функции он заменяется фактическим "х". Но в теле функции должен стоять именно формальный.
Цитата:
Сообщение от felarl Посмотреть сообщение
И еще вопросик, почему х не попадает в заданный интервал?
Знаете - я вообще не понимаю смысла интервала, равно как и метода выбора стартовой точки. В принципе, стартовой может быть любая точка не очень далеко расположенная от ожидаемого значения решения, лишь бы там не было корней производной.
Vladimir_S вне форума   Ответить с цитированием
Старый 19.12.2013, 21:06   #7 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Потому что так Вы назвали (в шапке функции) формальный параметр. При обращении к функции он заменяется фактическим "х". Но в теле функции должен стоять именно формальный.Знаете - я вообще не понимаю смысла интервала, равно как и метода выбора стартовой точки. В принципе, стартовой может быть любая точка не очень далеко расположенная от ожидаемого значения решения, лишь бы там не было корней производной.
С d разобрался... А почему он пишет ответ 0.14, а не 1.45 например, на графике видно что там есть как этот корень, так и другой, да и метод дихотомии выдает ответ 1.45.
P.S. Извините если вопросы кажутся абсурдными, просто только учусь, и хотелось бы понимать что написанно.
felarl вне форума   Ответить с цитированием
Старый 19.12.2013, 22:57   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
А почему он пишет ответ 0.14, а не 1.45 например, на графике видно что там есть как этот корень, так и другой, да и метод дихотомии выдает ответ 1.45.
Точнее
Код:
x= 1.40303      f(x)= 0.000003728748
А есть и третий корень - чай, уравнение-то кубическое!
Код:
x= 2.45161      f(x)= 0.000003331817
Все три корня можно получить, задавая исходную точку где-то в окрестности каждого из них. Вот поэтому прежде, чем численно решать уравнение, нужно его исследовать, в простейшем случае - построить график да и посмотреть, где корень, единствен ли он, а если их несколько - какой нужен и т.п. В нашем случае график выглядит так:
Миниатюры
a0.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 20.12.2013, 19:15   #9 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Точнее
Код:
x= 1.40303      f(x)= 0.000003728748
А есть и третий корень - чай, уравнение-то кубическое!
Код:
x= 2.45161      f(x)= 0.000003331817
Все три корня можно получить, задавая исходную точку где-то в окрестности каждого из них. Вот поэтому прежде, чем численно решать уравнение, нужно его исследовать, в простейшем случае - построить график да и посмотреть, где корень, единствен ли он, а если их несколько - какой нужен и т.п. В нашем случае график выглядит так:
А что считать исходной точкой в программе? я так понимаю точку а=0,4?
felarl вне форума   Ответить с цитированием
Старый 20.12.2013, 19:25   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
А что считать исходной точкой в программе? я так понимаю точку а=0,4?
Да почему же? ЛЮБУЮ точку где-то поблизости от предполагаемого корня (находится, например, по графику). Вот Вам вариант программы, выдающий все три корня - и причем вообще безо всяких a и b:
Код:
uses Crt;
const
 e=0.001;
var
 x: real;

function f1(d: real): real;
begin
 f1:=(d-2)*(d-2)*2*d-1;
end;

function f2(d:real): real;
begin
 f2:=6*d*d-16*d+8;
end;

begin
 Clrscr;

 x:=0.2;
 while abs(f1(x))>e do
  begin
   x:=x-f1(x)/f2(x);
  end;
 Writeln ('x= ',x:0:5,'   f(x)= ',f1(x):0:12);

 x:=1.6;
 while abs(f1(x))>e do
  begin
   x:=x-f1(x)/f2(x);
  end;
 Writeln ('x= ',x:0:5,'   f(x)= ',f1(x):0:12);

 x:=2.5;
 while abs(f1(x))>e do
  begin
   x:=x-f1(x)/f2(x);
  end;
 Writeln ('x= ',x:0:5,'   f(x)= ',f1(x):0:12);

 Readln
end.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

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

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

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

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




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

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