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


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

Здравствуйте, помогите чем можете. Работать в паскале начал недавно, есть уравнение решил его методом дихотомии, а вот методом Ньютона не могу, можете момочь? сообственно само уравнение: (x-2)^2*2x-1=0, на интервале (0;2) с точностью E=0,001
Вот кое что попробывал:img112.jpg
felarl вне форума   Ответить с цитированием

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

Форум наполнен схожими обсуждениями

Система для решения уравнений методом хорд на C/C++
Решение системы уравнений в Экселе
Методом Рунге-Кутта найти решение дифференциальных уравнений
Решение кубического уравнения методом хорд, Python

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

Цитата:
Сообщение от felarl Посмотреть сообщение
Здравствуйте, помогите чем можете. Работать в паскале начал недавно, есть уравнение решил его методом дихотомии, а вот методом Ньютона не могу, можете момочь? сообственно само уравнение: (x-2)^2*2x-1=0, на интервале (0;2) с точностью E=0,001
Знаете, я в некотором затруднении. Видите ли, у данного кубического уравнения имеются три вещественных корня, в том числе два из них - в указанном интервале. И какой из них прикажете искать? Или оба? А какой Вы нашли?

На всякий случай - проверьте условие задачи. Может быть, там не "-1", а "+1"? Тогда вещественный корень будет единственным.

Кроме того, Вы АБСОЛЮТНО неправильно задаёте функции. Каждая (да-да, именно КАЖДАЯ) должна иметь структуру типа:

Код:
Function FuFuFu(ppp:real):real;
 begin
  ....
  ....
  ....
  FuFuFu:=....
 end;
И никакого объединения их и, тем более, сначала перечня заголовков, а потом (в одном блоке) перечня тел - НЕ ДОПУСКАЕТСЯ!!!
(Что-то похожее, т.е. перечень заголовков, используется при написании модулей, но и там в другом разделе функция задается в виде приведенной выше структуры. Ну или если функция F1 является внутренней по отношению к F, а функция F2 - внутренней по отношению к F1. Но в этом случае там должно быть три вложенных блока, а не один, и, кроме того, вызвать из основной программы F1 и F2 в таком случае невозможно).
Миниатюры
cube1.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 20.10.2013, 15:28   #3 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Знаете, я в некотором затруднении. Видите ли, у данного кубического уравнения имеются три вещественных корня, в том числе два из них - в указанном интервале. И какой из них прикажете искать? Или оба? А какой Вы нашли?

На всякий случай - проверьте условие задачи. Может быть, там не "-1", а "+1"? Тогда вещественный корень будет единственным.

Кроме того, Вы АБСОЛЮТНО неправильно задаёте функции. Каждая (да-да, именно КАЖДАЯ) должна иметь структуру типа:

Код:
Function FuFuFu(ppp:real):real;
 begin
  ....
  ....
  ....
  FuFuFu:=....
 end;
И никакого объединения их и, тем более, сначала перечня заголовков, а потом (в одном блоке) перечня тел - НЕ ДОПУСКАЕТСЯ!!!
(Что-то похожее, т.е. перечень заголовков, используется при написании модулей, но и там в другом разделе функция задается в виде приведенной выше структуры. Ну или если функция F1 является внутренней по отношению к F, а функция F2 - внутренней по отношению к F1. Но в этом случае там должно быть три вложенных блока, а не один, и, кроме того, вызвать из основной программы F1 и F2 в таком случае невозможно).
Да, да вы правы там +1 !!! Корень помоему где-то 0.14 должен быть. На счет того что не правильно задал функции, это да, просто так объяснили нам...
felarl вне форума   Ответить с цитированием
Старый 20.10.2013, 15:30   #4 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Цитата:
Сообщение от felarl Посмотреть сообщение
Сам ход решения хоть правильный?
Не могу сказать, ибо хода не понимаю. Вы что, пытаетесь в одну программу оба метода засадить? Допустим. Но, во-первых, там F1 (первая производная) сосчитана неверно (откуда Вы взяли коэффициент 64? Должен быть 16), а во-вторых - ну на кой там вторая производная?
Цитата:
Сообщение от felarl Посмотреть сообщение
Да, да вы правы там +1 !!! Корень помоему где-то 0.14 должен быть. На счет того что не правильно задал функции, это да, просто так объяснили нам...
Совсем другое дело. Теперь график выглядит так:
cube2.jpg
Но корень там вовсе не "где-то 0.14", а около -0.1. Между прочим, в случае одного вещественного корня кубическое уравнение решается точно методом Кардано, и это можно использовать для контроля правильности результата работы итерационных программ. Так вот, формула Кардано даёт х=-0.112085...
Теперь решим задачу методом Ньютона:
Код:
Const
 e=0.001;
Var
 x0_old,x0_new,D:Real;

Function F(z:real):real;
begin
 F:=z*z*z*2-z*z*8+z*8+1;
end;

Function F1(z:real):real;
begin
 F1:=z*z*6-z*16+8;
end;

Begin
 x0_old:=0;
 Repeat
  x0_new:=x0_old-F(x0_old)/F1(x0_old);
  D:=Abs(x0_old-x0_new);
  x0_old:=x0_new;
 Until D<e;
 Writeln('Result: x = ',x0_new:0:3);
 Readln
End.
Результат работы этой программы: х=-0.112.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

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

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Не могу сказать, ибо хода не понимаю. Вы что, пытаетесь в одну программу оба метода засадить? Допустим. Но, во-первых, там F1 (первая производная) сосчитана неверно (откуда Вы взяли коэффициент 64? Должен быть 16), а во-вторых - ну на кой там вторая производная?
Но корень там вовсе не "где-то 0.14", а около -0.1. Между прочим, в случае одного вещественного корня кубическое уравнение решается точно , и это можно использовать для контроля правильности результата работы итерационных программ. Так вот, формула Кардано даёт х=-0.112085...
Теперь решим задачу методом Ньютона:
Код:
Const
 e=0.001;
Var
 x0_old,x0_new,D:Real;

Function F(z:real):real;
begin
 F:=z*z*z*2-z*z*8+z*8+1;
end;

Function F1(z:real):real;
begin
 F1:=z*z*6-z*16+8;
end;

Begin
 x0_old:=0;
 Repeat
  x0_new:=x0_old-F(x0_old)/F1(x0_old);
  D:=Abs(x0_old-x0_new);
  x0_old:=x0_new;
 Until D<e;
 Writeln('Result: x = ',x0_new:0:3);
 Readln
End.
Результат работы этой программы: х=-0.112.
Извините,вроде все понял, но не могли бы объяснить один момент? в этой строчке Writeln('Result: x = ',x0_new:0:3); не понятно что такое x0_new:0:3. если не сложноможете пояснить?
felarl вне форума   Ответить с цитированием
Старый 21.10.2013, 16:06   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
если не сложноможете пояснить?
Ни в малейшей степени не сложно. Поясняю.
Это формат вывода вещественного числа. Если его не поставить, то выведется нечто безобразное в таком роде:
-1.1208567754337654Е-001
Если поставить одно число, то оно будет означать полное количество выводимых знаков, включая запись порядка. Так, если напишем х:12, то получим
-1.1208Е-001
Наличие двух чисел в формате означает, что мы выводим число в формате целая часть-точка-дробная часть, и при этом первое число означает ПОЛНОЕ количество знаков, а второе - число знаков дробной части. Так, если задать х:8:3, то будем иметь
Код:
х=  -0.112
А вот если первое число - 0, то это означает, что мы фиксируем только число знаков дробной части, а уж целая - какая получится, такая и выведется. Таким образом, формат 0:3 означает, что я прошу вывести результат с тремя значащими цифрами после десятичного разделителя (точки).
Vladimir_S вне форума   Ответить с цитированием
Старый 21.10.2013, 21:03   #8 (permalink)
felarl
Member
 
Регистрация: 18.10.2013
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Ни в малейшей степени не сложно. Поясняю.
Это формат вывода вещественного числа. Если его не поставить, то выведется нечто безобразное в таком роде:
-1.1208567754337654Е-001
Если поставить одно число, то оно будет означать полное количество выводимых знаков, включая запись порядка. Так, если напишем х:12, то получим
-1.1208Е-001
Наличие двух чисел в формате означает, что мы выводим число в формате целая часть-точка-дробная часть, и при этом первое число означает ПОЛНОЕ количество знаков, а второе - число знаков дробной части. Так, если задать х:8:3, то будем иметь
Код:
х=  -0.112
А вот если первое число - 0, то это означает, что мы фиксируем только число знаков дробной части, а уж целая - какая получится, такая и выведется. Таким образом, формат 0:3 означает, что я прошу вывести результат с тремя значащими цифрами после десятичного разделителя (точки).
Большое спасибо! Еще один вопрос назрел... а интервалы зачем даны? их программа как-нибудь использует?
felarl вне форума   Ответить с цитированием
Старый 22.10.2013, 09:22   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от felarl Посмотреть сообщение
Большое спасибо! Еще один вопрос назрел... а интервалы зачем даны? их программа как-нибудь использует?
Нет. Просто для улучшения читабельности. Равно как и отступы, "лесенки" и прочие элементы форматирования листинга.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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