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


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

Снова нужна помощь... Решаю уравнение методом Ньютона, вроде все получается, найденый мною корень хоть и существует, но не входит в заданный интервал, можете указать на ошибку? Заранее благодарен)
Само уравнение: ln(2-x)-cos2x=0, интервал [1;2]
Сама программа:

uses crt;
var x,a,b,e: real;
function f1(x: real): real;
begin
f1:=ln(2-x)-cos(2*x);
end;
function f2(x:real): real;
begin
f2:=(-1/2-x)+2*sin(2*x);
end;
begin
clrscr;
a:=1;
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));
end.
felarl вне форума   Ответить с цитированием

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

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

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

Старый 28.02.2014, 20:36   #12 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Прежде всего, правильно сосчитайте производную (первое слагаемое), а там дальше посмотрим. Пока что в качестве f2 написана полная чушь.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.02.2014, 21:07   #13 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Прежде всего, правильно сосчитайте производную (первое слагаемое), а там дальше посмотрим. Пока что в качестве f2 написана полная чушь.
Не понимаю где ошибка... вроде правильно производную взял, может записал в строчку не правильно...
felarl вне форума   Ответить с цитированием
Старый 28.02.2014, 21:12   #14 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
Не понимаю где ошибка... вроде правильно производную взял, может записал в строчку не правильно...
Охо-хо, грехи наши тяжкие... Объясняю.
У Вас:
f2:=(-1/2-x)+2*sin(2*x);
Надо:
f2:=-1/(2-x)+2*sin(2*x);
Vladimir_S вне форума   Ответить с цитированием
Старый 28.02.2014, 21:17   #15 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Охо-хо, грехи наши тяжкие... Объясняю.
У Вас:
f2:=(-1/2-x)+2*sin(2*x);
Надо:
f2:=-1/(2-x)+2*sin(2*x);
Да, понял свою ошибку, Спасибо) часто ошибки бывают именно в таких местах...
felarl вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 28.02.2014, 21:32   #16 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Если возможно, подскажите почему здесь происходит деление на ноль, и можно ли это исправить, не меняя интервал [0;2]

uses crt;
var x,a,b,e: real;
function f1(x: real): real;
begin
f1:=(x-2)*(x-2)*2*x-1;
end;
function f2(x:real): real;
begin
f2:=6*x*x-16*x+8;
end;
begin
clrscr;
a:=0;
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));
end.
felarl вне форума   Ответить с цитированием
Старый 28.02.2014, 21:39   #17 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
Если возможно
Возможно.
Цитата:
Сообщение от felarl Посмотреть сообщение
подскажите почему здесь происходит деление на ноль
Потому что в указанном интервале производная проходит через 0 (горизонтальная касательная, см. график выше).
Цитата:
Сообщение от felarl Посмотреть сообщение
и можно ли это исправить, не меняя интервал [0;2]
Нет.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.02.2014, 21:41   #18 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Возможно.Потому что в указанном интервале производная проходит через 0 (горизонтальная касательная, см. график выше).Нет.
Огромное спасибо за ответы)
felarl вне форума   Ответить с цитированием
Старый 28.02.2014, 21:49   #19 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

И вообще, хотел бы я понять, откуда берется вот эта, вставляемая Вами во все программы, ахинея:
if f1(a)*f2(a)>0 then x:=a
else x:=b;
Ни малейшего смысла в ней я, извините, не вижу. Требуется проверка условия положительности произведения производных на концах интервала:
if f2(a)*f2(b)>0 then
Если это условие НЕ выполняется, то задача заведомо методом Ньютона не решается. Если выполняется, то тоже не факт, что решается: функция может оказаться сильно осциллирующей и производная внутри интервала может несколько раз пройти через ноль.
Поэтому, как я Вам уже писал и повторю снова: исходная точка должна выбираться "вручную", например, по графику функции. Алгоритмов выбора ее не существует. Мне, по крайней мере, они не известны.
Эх, разбирали-разбирали задачу, график рисовали, про выбор исходных точек жевали-переживали - да всё, как видно, впустую...
Vladimir_S вне форума   Ответить с цитированием
Старый 11.03.2014, 20:41   #20 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
И вообще, хотел бы я понять, откуда берется вот эта, вставляемая Вами во все программы, ахинея:
if f1(a)*f2(a)>0 then x:=a
else x:=b;
Ни малейшего смысла в ней я, извините, не вижу. Требуется проверка условия положительности произведения производных на концах интервала:
if f2(a)*f2(b)>0 then
Если это условие НЕ выполняется, то задача заведомо методом Ньютона не решается. Если выполняется, то тоже не факт, что решается: функция может оказаться сильно осциллирующей и производная внутри интервала может несколько раз пройти через ноль.
Поэтому, как я Вам уже писал и повторю снова: исходная точка должна выбираться "вручную", например, по графику функции. Алгоритмов выбора ее не существует. Мне, по крайней мере, они не известны.
Эх, разбирали-разбирали задачу, график рисовали, про выбор исходных точек жевали-переживали - да всё, как видно, впустую...
Нас так учат, к сожалению, и поэтому я не могу взять в ручную начальную точку, т.к. это будет "не то что от нас хотят"
felarl вне форума   Ответить с цитированием
Ads

Яндекс

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

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

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

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




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

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