Форум: "Потрепаться";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизРешение нелинейных ур-ий методом Нютона и половинного деления Найти похожие ветки
← →
Dimich1978 © (2004-08-30 14:37) [0]Обратно, я со совей проблемой по поводу решения нелинейных ур-ий методом Нютона и половинного деления, значит просчитал я все и получилось что данная функция лежит в интервале а,б(2.2,2.4) и корень является 2.3, пользуясь методом пол. деления этот корень получается (типа 2.29 и т.д), а вот метод Ньютона говорит что "Метод нельзя применить", хотя по идеи он тоже должен корень найти, я думаю что-то не правильно реализована математика в этом методе, честно признаюсь этот код не мой. Плиз помогите разобраться почему метод Ньютона не хочет искать корень уравнения? Всем заранее спасибо.
program course2;
const
k = 65;
var
ax, bx : real;
n,m : integer;
function f1(x : real;n : integer):real;
begin
case n of
1 : f1:=3*sin(sqrt(x))+0.35*x-3.8;
end; { case }
end;
function f2(x : real;n : integer):real;
begin
case n of
1 : f2:=3*sin(sqrt(x))-0.35*x-3.8;
end; { case }
end;
function f3(x : real;n : integer):real;
begin
case n of
1 : f3:=3*cos(sqrt(x))/(2*sqrt(x))+0.35;
end; { case }
end;
procedure epsilon(var e : real);
begin
e:= 1; repeat e:= e/2 until (e+1)=1;
end; { epsilon }
procedure dihotomia(l : integer;a,b:real);
var
e, x : real;
begin
epsilon(e);
if (f1(a,l)*f1(b,l))<0 then
begin
repeat begin
if (f1(a,l)*f1((a+b)/2,l))>0 then a:= (a+b)/2 else
if (f1(b,l)*f1((a+b)/2,l))>0 then b:= (a+b)/2 else
begin a:= (a+b)/2; b:= a end;
end
until abs(a-b)<e*k;
x:= (a+b)/2;
writeln ("Корень уравнения X = ",x);
end
else writeln ("Метод нельзя применить");
end; { dihotomia }
procedure Njuton (l : integer; a,b: real);
var
e, x, xx, dx, xa : real;
ind : boolean;
begin
epsilon(e);
dx:= (b-a)/100;
xa:= a;
ind:= true;
repeat begin
if ((f2(xa,l))*(f3(xa,l)))<=0 then ind:= false else xa:=
xa+dx;
end;
until (xa>b) or (ind=false);
if (ind=true) then
begin
x:= (a+b)/2;
repeat begin
xx:= x;
x:= x - (f1(x,l))/(f2(x,l));
end;
until abs(xx-x)<e*k;
writeln ("Корень уравнения X = ",x);
end else writeln ("Метод нельзя применить");
end; { Njuton }
begin
repeat begin
writeln; writeln; writeln;
writeln ("Выберите нужное уравнение");
writeln (" 1: f1:=3*sin(sqrt(x))+0.35*x-3.8 = 0");
writeln (" 0: Выход из программы");
readln (n);
if n<>0 then begin
writeln ("Введите рассматриваемый отрезок");
readln (ax, bx);
repeat begin
writeln; writeln ("Выберите метод решения");
writeln (" 1: Метод половинного деления");
writeln (" 2: Метод Ньютона");
writeln (" 0: Возврат к выбору уравнений");
readln (m);
if m<>0 then begin
case m of
1 : dihotomia (n, ax, bx);
2 : njuton (n, ax, bx);
end; { case }
end;
end;
until m=0;
end;
end;
until n = 0;
end.
← →
pasha_golub © (2004-08-30 15:06) [1]А почему кто-то должен разбирать чужой даже для тебя код?
← →
Dimich1978 © (2004-08-30 15:36) [2]потому что я давно не занимаюсь программированием и еще я по человечески прошу помочь. Жене в институт потребовалась эти методы на Паскале. Если нет желания...
← →
Труп Васи Доброго © (2004-08-30 15:59) [3]Давно это было, но помню что метод Ньютона имеет условную сходимость, а вот какое условие не помню. Видать это условие как раз и нарушается. А для дихотомии главное чтобы на отрезке нечётное количество корней было.
З.Ы. Спроси у Думкина, он круче всех в математике!
← →
pasha_golub © (2004-08-30 16:01) [4]Dimich1978 © (30.08.04 15:36) [2]
Есть предложение. Пусть жена сюда зайдет. Решать за нее конечно никто не станет, но вот объяснить доступно смогут.
← →
Dimka Maslov © (2004-08-30 16:04) [5]function f3(x : real;n : integer):real;
begin
case n of
1 : f3:=3*cos(sqrt(x))/(2*sqrt(x))+0.35;
end; { case }
end;
Сильно. А если n<>1, какой результат вернёт функция? И почему автор не применил простой IF? А вы ещё его код разбирать собираетесь.
← →
han_malign © (2004-08-30 16:25) [6]Может для начала стоит правильно производные посчитать? Хотя насколько я помню метод Ньютона - это метод конечных разностей, где производная функция рассчитывается приближенно, или я ошибаюсь?
З.Ы. А програмирование здесь не причем - это численные методы...
>метод Ньютона имеет условную сходимость
вот это - "if ((f2(xa,l))*(f3(xa,l)))<=0 then ind:= false" - подразумевает что работать будет только для строго возрастающих вогнутых и строго убывающих выпуклых, (даже для прямой работать не будет(третья производная 0))... А тут осциллирующая подставляется, естественно - "Метод нельзя применить"...
← →
Труп Васи Доброго © (2004-08-30 16:30) [7]Нашёл! Правильно! f(х0) * f"" (х0) > 0.Это и есть условие применимости данного метода!
← →
pasha_golub © (2004-08-30 17:05) [8]Труп Васи Доброго © (30.08.04 16:30) [7]
Чего-то тут не то, вроде. //Почесывая репу
Тама условие вроде с начальной и конечно точкой связано. И что на данном отрезке функция дифференциируема и монотонна
← →
han_malign © (2004-08-30 17:16) [9]>pasha_golub © (30.08.04 17:05) [8]
(f(Xi)"*f"(Xi)>0)and(f(X0)*f(Xn)<0) - гарантирует, что касательная из Xi, попадет на отрезок (Xi,Xk) на оси ординат - где Xk - корень(то бишь, всегда приближаемся к корню с левой стороны, до достижения заданной точности).
Причем (f(Xi)"*f"(Xi)>0) - как раз одно из условий строгой монотонности...
← →
han_malign © (2004-08-30 17:23) [10]>попадет на отрезок (Xi,Xk)
- немного наврал - в интервал (X(i-1),Xi),X0<Xi<Xn,i=1..n
← →
Думкин © (2004-08-31 06:27) [11]> [8] pasha_golub © (30.08.04 17:05)
Там одна точка - начальная - от нее и пляшут.
1. Что есть f2 и f3? Если есть подозрение, что одна есть производная другой - то это не так. А именно они упоминаются в
> procedure Njuton (l : integer; a,b: real);
Newton нервно курит бабмбук.
> if (ind=true) then
конструкции такого вида - один из поводов к размышлению.
> [2] Dimich1978 © (30.08.04 15:36)
> потому что я давно не занимаюсь программированием и еще я по человечески прошу помочь
Ссылки в прошлый раз привели, закодировать их может любой школьник старше 6-го класса после 2-х дневного знакомства с Паскалем. Удачи.
← →
Думкин © (2004-08-31 06:36) [12]> [3] Труп Васи Доброго © (30.08.04 15:59)
> З.Ы. Спроси у Думкина, он круче всех в математике!
Круче всех только - шарики из под курицы. :)
Здесь очень много народа с намного более приличной математикой.
← →
Dimich1978 © (2004-08-31 13:06) [13]Спасибо. Кстати Ф2 и Ф3 я так понял в этом случае первая и вторая производные
← →
Думкин © (2004-08-31 13:09) [14]> [13] Dimich1978 © (31.08.04 13:06)
Это не так.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c