while (f(x)<>0) do
x:=x-f(x)/f_1(x);
Решение уравнения методом Ньютона(Pascal)
У меня нифига не получается :(
Код:
зацикливается, и x практически не изменяется :(
Помогите пожалуйста. язык реализации любой кроме ASM BASIC (ну и машинный код тоже не надо)
[COLOR="Red"]В названии темы надо указывать язык. Нарушение -5 за неверное название темы[/COLOR]Модератор.
Код:
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;
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 - точность.
Проблема оказалась в том, что для метода Ньютона просто не хватает точности ни одного типа :( пришлось сделать ограничения на точность, вроде работает, но от правильного ответа отличается уже знаке на 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;
begin
h:=x-f(x)/f_1(x);
if (abs(x-h)<=1e-9) then break;
x:=h;
end;
Код:
while (f(x)<>0) do
x:=x-f(x)/f_1(x);
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();
}
#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
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, можно и точнее попробівать
Вот вырезка из методы по ЧМ-у.
мда дал маху. выдернул код из старой лабораторки и не посмотрел, что там 2 - это производная, отсюда и непонятки, потому как функцию-то заменил, а производную...
вообще не пойму как делать