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

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

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

> Численные методы
AlaRic
сообщение 8.02.2003 10:04
Сообщение #1


...
*****

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

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


Написать программу решения нелинейных уравнений методом хорд.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
Closed Topic Открыть новую тему 
Ответов
___ALex___
сообщение 21.02.2003 13:48
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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