Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Решение уравнения методом Ньютона(Pascal)

27K
12 июня 2007 года
BigPaHa
3 / / 18.04.2007
Нужно решить уравнение вида x^3+сsinx-в=0 на отрезке [a;b] методом Ньютона(начальное приближение корня задано).

У меня нифига не получается :(

 
Код:
while (f(x)<>0) do
    x:=x-f(x)/f_1(x);


зацикливается, и x практически не изменяется :(


Помогите пожалуйста. язык реализации любой кроме ASM BASIC (ну и машинный код тоже не надо)
320
12 июня 2007 года
m_Valery
1.0K / / 08.01.2007
[COLOR="Red"]В названии темы надо указывать язык. Нарушение -5 за неверное название темы[/COLOR]Модератор.
257
12 июня 2007 года
kosfiz
1.6K / / 18.09.2005
а вот так тебе не подойдет?(вроде бы так правильно, но не гарантирую)
Код:
function Func(x,c,b:double):double;
begin
Func:=x*x*x+c*sin(x)-b;
end;

function Newton(x1,x2,eps,c,b:real):real;
var x,y:real;
begin
if (Func(x1,c,b)*2<0) then
    x:=x2
else
    x:=x1;
repeat
    y:=x-Func(x,c,b)/2;
    x:=y;
until (Func(x,c,b)/2<eps);
Newton:=x;
end;

попробуй может подойдет. x1 и x2 это соответственно левая и правая границы отрезка, т.е. x1=a и x2=b, eps - точность.
27K
13 июня 2007 года
BigPaHa
3 / / 18.04.2007
Переведенный вами пример, как я понимаю, это метод дихотомии.
Проблема оказалась в том, что для метода Ньютона просто не хватает точности ни одного типа :( пришлось сделать ограничения на точность, вроде работает, но от правильного ответа отличается уже знаке на 3-ем после запятой.

 
Код:
while (abs(f(x))>=1e-9) do
  begin
    h:=x-f(x)/f_1(x);
    if (abs(x-h)<=1e-9) then break;
    x:=h;
  end;
15K
13 июня 2007 года
Sara
79 / / 04.01.2007
2 BigPaHa: возможно, зацикливание происходит из-за того, что у тебя в цикле проверяется условие точного равенства:
 
Код:
while (f(x)<>0) do
    x:=x-f(x)/f_1(x);

т.е. выход из цикла может произойти только при точном равенстве f(x)==0, а это условие может и не выполниться никогда.
Вот пример работающего кода:
Код:
#include "conio.h"
#include "iostream.h"
#include "math.h"

double f(double x, double c, double b)
{
  return x*x*x + c*sin(x)-b;
}

double df(double x, double c)
{
  return 3*x*x + c*cos(x);
}

void main()
{
  double c = 1;
  double b = 1;
  double eps = 0.000001;
  double x = 0;
  clrscr();
  while( fabs(f(x,c,b)) > eps )
  {
    x = x - f(x,c,b)/df(x,c);
  }
  cout << x;
  getch();
}


2 kosfiz: что-то на метод Ньютона не очень похоже. Больше смахивает на метод дихотомии.

Собственно метод Ньютона описан вот здесь:
http://alglib.sources.ru/equations/feq0newton.php
274
13 июня 2007 года
Lone Wolf
1.3K / / 26.11.2006
Это метод касательных(иногда называемый методом Ньютона). а теперь два замечания к условию останова:
1. Метод неточный!! поэтому 0 он не даст!
2. В методе касательных используется следуйщая оценка точности:
[SIZE="5"](M[/SIZE][SIZE="1"]2[/SIZE][SIZE="5"]/([/SIZE][SIZE="5"]2*m[/SIZE][SIZE="1"]1[/SIZE][SIZE="5"]))*(x[/SIZE][SIZE="1"]k[/SIZE]-[SIZE="5"]x[/SIZE][SIZE="1"]k-1[/SIZE][SIZE="5"])^2[/SIZE]
где [SIZE="5"]М[/SIZE][SIZE="1"]2 [/SIZE]- максимум модуля второй производной на отрезке, [SIZE="5"]m[/SIZE][SIZE="1"]1[/SIZE] - минимум модуля первой производной на отрезке.
Теперь в условие цикла поставь, єту формулу и савнивай с некоторой ране заданой точностью. например 0.001, можно и точнее попробівать
Вот вырезка из методы по ЧМ-у.
257
13 июня 2007 года
kosfiz
1.6K / / 18.09.2005
мда дал маху. выдернул код из старой лабораторки и не посмотрел, что там 2 - это производная, отсюда и непонятки, потому как функцию-то заменил, а производную...
77K
31 октября 2011 года
ann77
1 / / 31.10.2011
методом касательных с точностью е вычислить корень уравнения tg x - x = 0 начальное приближение к корню равно 4,67.
вообще не пойму как делать
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог