Численные методы |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Численные методы |
AlaRic |
Сообщение
#1
|
... Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: 3 |
Написать программу решения нелинейных уравнений методом хорд.
|
___ALex___ |
Сообщение
#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 - |
Текстовая версия | 20.04.2024 8:21 |