Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

Решение нелинейных ур-ий методом Нютона и половинного деления   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
1-1094032448
Anderson
2004-09-01 13:54
2004.09.19
Уменьшение/увеличение прозрачности отдельных цветов формы


9-1085367893
Papai
2004-05-24 07:04
2004.09.19
Help


11-1080647045
Viner
2004-03-30 15:44
2004.09.19
PBitMap


14-1093695706
DeadMeat
2004-08-28 16:21
2004.09.19
Вот так вот...


4-1091705214
Aldor_
2004-08-05 15:26
2004.09.19
DeviceIoControl error