IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
Closed Topic Открыть новую тему 
> Численные методы
AlaRic
сообщение 8.02.2003 10:04
Сообщение #1


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Написать программу решения нелинейных уравнений методом хорд.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 20.02.2003 19:36
Сообщение #2


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Никто?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Gid
сообщение 21.02.2003 4:31
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


Ну я забыл :-/
Ладно теперь вспомнил! smile.gif
Подумаю на досуге
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 21.02.2003 13:48
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


                                                 
//___методы решения нелинейных одиночных уравнений___//

//метод деления отрезка пополам(метод бисекции)
Код

function MetDelOtrPop(a, b, eps: Extended): Extended;
var
c, Fa: Extended;

function Func(Arg: Extended): Extended;
begin

Result := Arg - Sin(Arg) - 0.25;//здесь указывается нужная ф-ия

end;

begin

Fa := Func(a);
repeat
 c := (a + B) / 2;
 if Fa * Func© > 0 then a := c else b := c;
until Abs(Func©) <= eps;
Result := c;

end;


//метод хорд
Код

function MetHord(a, b, eps: Extended): Extended;
var
Pribl, PredPribl: Extended;

function Func(x: Extended): Extended;
begin

Result := Sqr(x) - 2;//здесь указывается нужная ф-ия

end;

begin

Pribl := b;
repeat
 PredPribl := Pribl;
 Pribl := PredPribl - (a - PredPribl) * Func(PredPribl) / (Func(a) - Func(PredPribl));
until Abs(Pribl - PredPribl) <= eps;
Result := Pribl;

end;

//метод Ньютона(метод касательных)
Код

function MetNewtona(nachpribl, eps: Extended): Extended;
var
Pribl, PredPribl: Extended;

function Func(Arg: Extended): Extended;
begin

Result := Sqr(Arg) - 2;//здесь указывается нужная ф-ия

end;

function ProizvFunc(Arg: Extended): Extended;
begin

Result := 2 * Arg;//здесь указывается производная нужной ф-ии

end;

begin

Pribl := nachpribl;
repeat
 PredPribl := Pribl;
 Pribl := PredPribl - Func(PredPribl) / ProizvFunc(PredPribl);
until Abs(Pribl - PredPribl) <= eps;
Result := Pribl;

end;

//модификация метода Ньютона 1(применяется когда нельзя получить производную функции)
Код

function MetNewtona(nachpribl, eps: Extended): Extended;
var
Pribl, PredPribl: Extended;

function Nevyazka(Arg: Extended): Extended;

function Func(Arg: Extended): Extended;
begin

Result := Sqr(Arg) - 2;//здесь указывается нужная ф-ия

end;

begin

Result := -2 * eps * Func(Arg) / (Func(Arg + eps) - Func(Arg - eps));

end;

begin

Pribl := nachpribl;
repeat
 PredPribl := Pribl;
 Pribl := PredPribl + Nevyazka(PredPribl);
until Abs(Pribl - PredPribl) <= eps;
Result := Pribl;

end;

//модификация метода Ньютона 2(метод Рыбакова)

Код

type
ArrayResh = Array of Extended;

function MetRib(a, b, eps: Extended; M: LongWord): ArrayResh;
var
x, dx: Extended;
Sch: LongWord;
CheckOnOut: Boolean;

function Func(Arg: Extended): Extended;
begin

Result := Sqr(Arg) - 2;//здесь указывается нужная ф-ия

end;

begin

Sch := 0;
x := a;
 repeat
  repeat
   dx := Abs(Func(x)) / M;
   x := x + dx;
   if dx <= eps then CheckOnOut := True else CheckOnOut := False;
  until CheckOnOut or (x > B);
  if CheckOnOut then
   begin
    Inc(Sch);
    SetLength(Result, Sch);
    Result[Sch - 1] := x;
    x := x + 20 * eps;
   end;
 until x > b;

end;

//метод простой итерации
Код

function SimpleIter(nachpribl, eps: Extended): Extended;
var
Pribl1, Pribl2: Extended;

function NeedFunc(x: Extended): Extended;
begin

Result := Sin(x) + 0.25;//здесь указывается нужная ф-ия

end;

begin

Pribl2 := nachpribl;
repeat
 Pribl1 := Pribl2;
 Pribl2 := NeedFunc(Pribl1);
until Abs(Pribl1 - Pribl2) <= eps;
Result := Pribl2;

end;


//комбинированный метод(метод хорд + метод касательных)
Код

function CombMet(a, b, eps: Extended): Extended;
var
PriblN, PriblH: Extended;

function Func(x: Extended): Extended;
begin

Result := Sqr(x) - 2;//здесь указывается нужная ф-ия

end;

begin

PriblN := a;
PriblH := b;
repeat
 PriblH := PriblH - (PriblN - PriblH) * Func(PriblH) / (Func(PriblN) - Func(PriblH));
 PriblN := PriblN - 2 * eps * Func(PriblN) / (Func(PriblN + eps) - Func(PriblN - eps));
until Abs(PriblN - PriblH) <= eps;
Result := (PriblN + PriblH) * 0.5;

end;



вот

Сообщение отредактировано: Oleg_Z - 22.05.2004 4:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 21.02.2003 16:12
Сообщение #5


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Zole
сообщение 21.05.2004 20:41
Сообщение #6





Группа: Пользователи
Сообщений: 3

Репутация: -  0  +


Текст программы:
Код

Program HORDA;
Uses crt;
  Function f(x:real):real;
     Begin
        f:=x*sin(x)-1; {вставь свою функцию}
     End;
  Function pr1(x:real):real;
     Begin
        pr1:=sin(x)+x*cos(x);{1 производная}
     End;
  Function pr2(x:real):real;
     Begin
        pr2:=2*cos(x)-x*sin(x);{2 производная}
     End;
Var x1,x2,c,E,a,b:real;
      n:integer;
Begin
   Clrscr;
     Writeln('Введите границы отрезка - а и b');
     Read(a,B);
     Writeln('Введите точность Е');
     Read(E);
          n:=0;
      if f(a)*f(B)<0 then begin
    repeat
      if pr1(a)*pr2(a)>0 then begin
          n:=n+1;
          x1:=a-(f(a)*(b-a))/(f(B)-f(a));
          x2:=x1-(f(x1)*(b-x1)/(f(B)-f(x1)));
          a:=x2;
                                                end
      else
          n:=n+1;
          x1:=b-(f(B)*(b-a))/(f(B)-f(a));
          x2:=x1-f(x1)*(x1-a)/(f(x1)-f(a));
          b:=x2;
                           end;
    until abs(x2-x1)<=E;
     Writeln('Корень уравнения х = ', x2:8:6);
     Writeln('Число итераций = ',n);
     Readln;
     Readln;
   End.

:p4:

Сообщение отредактировано: Oleg_Z - 22.05.2004 4:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 22.05.2004 4:06
Сообщение #7


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


А что в тег кода перестали помещать тексты программ?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 25.06.2025 10:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"