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

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Ошибка в методе Ньютона (http://www.tehnari.ru/f41/t93217/)

felarl 19.12.2013 18:59

Ошибка в методе Ньютона
 
Пишет Вещественное деление на 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 19:00

Буду благодарен за помощь!

Vladimir_S 19.12.2013 20:02

Цитата:

Сообщение от felarl (Сообщение 982781)
Буду благодарен за помощь!

Легко. Всё правильно, кроме того, что в ТЕЛЕ обеих функций аргументом должно быть 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

felarl 19.12.2013 20:45

Цитата:

Сообщение от Vladimir_S (Сообщение 982793)
Легко. Всё правильно, кроме того, что в ТЕЛЕ обеих функций аргументом должно быть 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

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

Vladimir_S 19.12.2013 20:57

Цитата:

Сообщение от felarl (Сообщение 982817)
Тааак, извините, могли бы объяснить почему d? что-то я не понимаю...

Потому что так Вы назвали (в шапке функции) формальный параметр. При обращении к функции он заменяется фактическим "х". Но в теле функции должен стоять именно формальный.
Цитата:

Сообщение от felarl (Сообщение 982818)
И еще вопросик, почему х не попадает в заданный интервал?

Знаете - я вообще не понимаю смысла интервала, равно как и метода выбора стартовой точки. В принципе, стартовой может быть любая точка не очень далеко расположенная от ожидаемого значения решения, лишь бы там не было корней производной.

felarl 19.12.2013 21:06

Цитата:

Сообщение от Vladimir_S (Сообщение 982826)
Потому что так Вы назвали (в шапке функции) формальный параметр. При обращении к функции он заменяется фактическим "х". Но в теле функции должен стоять именно формальный.Знаете - я вообще не понимаю смысла интервала, равно как и метода выбора стартовой точки. В принципе, стартовой может быть любая точка не очень далеко расположенная от ожидаемого значения решения, лишь бы там не было корней производной.

С d разобрался... А почему он пишет ответ 0.14, а не 1.45 например, на графике видно что там есть как этот корень, так и другой, да и метод дихотомии выдает ответ 1.45.
P.S. Извините если вопросы кажутся абсурдными, просто только учусь, и хотелось бы понимать что написанно.

Vladimir_S 19.12.2013 22:57

Вложений: 1
Цитата:

Сообщение от felarl (Сообщение 982831)
А почему он пишет ответ 0.14, а не 1.45 например, на графике видно что там есть как этот корень, так и другой, да и метод дихотомии выдает ответ 1.45.

Точнее
Код:

x= 1.40303      f(x)= 0.000003728748
А есть и третий корень - чай, уравнение-то кубическое!
Код:

x= 2.45161      f(x)= 0.000003331817
Все три корня можно получить, задавая исходную точку где-то в окрестности каждого из них. Вот поэтому прежде, чем численно решать уравнение, нужно его исследовать, в простейшем случае - построить график да и посмотреть, где корень, единствен ли он, а если их несколько - какой нужен и т.п. В нашем случае график выглядит так:

felarl 20.12.2013 19:15

Цитата:

Сообщение от Vladimir_S (Сообщение 982863)
Точнее
Код:

x= 1.40303      f(x)= 0.000003728748
А есть и третий корень - чай, уравнение-то кубическое!
Код:

x= 2.45161      f(x)= 0.000003331817
Все три корня можно получить, задавая исходную точку где-то в окрестности каждого из них. Вот поэтому прежде, чем численно решать уравнение, нужно его исследовать, в простейшем случае - построить график да и посмотреть, где корень, единствен ли он, а если их несколько - какой нужен и т.п. В нашем случае график выглядит так:

А что считать исходной точкой в программе? я так понимаю точку а=0,4?

Vladimir_S 20.12.2013 19:25

Цитата:

Сообщение от felarl (Сообщение 983047)
А что считать исходной точкой в программе? я так понимаю точку а=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.



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

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