Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.049 c
14-1093878077
Piter
2004-08-30 19:01
2004.09.19
Контрол для редактирования текста


3-1092905893
Alex_Bredin
2004-08-19 12:58
2004.09.19
Выделение области в DBGridEH


1-1094532933
BillyJeans
2004-09-07 08:55
2004.09.19
override private метода...


14-1094033837
Aleksey Pavlov
2004-09-01 14:17
2004.09.19
Требуется Delphi-программист.


3-1093348518
Zif
2004-08-24 15:55
2004.09.19
Ошибка при удалении картинки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский