19.12.2013, 18:59 | #1 (permalink) |
Member
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ошибка в методе Ньютона
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. |
19.12.2013, 18:59 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Тут может содержаться интересующая вас информация "Колыбель" Ньютона Метод Ньютона Решение уравнений методом Ньютона |
19.12.2013, 20:02 | #3 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Легко. Всё правильно, кроме того, что в ТЕЛЕ обеих функций аргументом должно быть 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 |
19.12.2013, 20:45 | #4 (permalink) | |
Member
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
|
|
19.12.2013, 20:49 | #5 (permalink) |
Member
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
И еще вопросик, почему х не попадает в заданный интервал?
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
19.12.2013, 20:57 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Потому что так Вы назвали (в шапке функции) формальный параметр. При обращении к функции он заменяется фактическим "х". Но в теле функции должен стоять именно формальный.Знаете - я вообще не понимаю смысла интервала, равно как и метода выбора стартовой точки. В принципе, стартовой может быть любая точка не очень далеко расположенная от ожидаемого значения решения, лишь бы там не было корней производной.
|
19.12.2013, 21:06 | #7 (permalink) | |
Member
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
P.S. Извините если вопросы кажутся абсурдными, просто только учусь, и хотелось бы понимать что написанно. |
|
19.12.2013, 22:57 | #8 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Код:
x= 1.40303 f(x)= 0.000003728748 Код:
x= 2.45161 f(x)= 0.000003331817 |
|
20.12.2013, 19:15 | #9 (permalink) | |
Member
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
|
|
20.12.2013, 19:25 | #10 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Да почему же? ЛЮБУЮ точку где-то поблизости от предполагаемого корня (находится, например, по графику). Вот Вам вариант программы, выдающий все три корня - и причем вообще безо всяких 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|