Помощь - Поиск - Пользователи - Календарь
Полная версия: задачи на численное решение нелинейных уравнений
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
mafia1232
для уравнения 15*x^4-4*x^3-6*x^2-4*x-1=0
написать решение методом касательных и хорд с точность 10^-5
производная первого порядка 60*x^3-12*x^2-12*x-4=0
volvo
Что, очень трудно посмотреть FAQ ПРЕЖДЕ чем задать вопрос? Обязательно плодить одни и те же темы еще и еще раз? angry.gif
FAQ: Численное решение и визуализация
mafia1232
эту тему в FAQ я видел, но я не понимаю куда вставить свое уравнение. а если взять решение из Faq то прога выдает ощибку 8087 в
Код
Begin
    F := Sqr(Arg) - 2
  End;


извините, но в паскале не разбираюсь sad.gif
klem4
напиши первой строчкой в программе
{$n+}


подключение математического сопроцессора для работы с вещественными числами.
mafia1232
исправте если неправильно пожайлуста. метод хорд для уравнения выше.
Исходный код
program xord;
uses Crt;
const
eps = 0.00001;
var
lB, rB, x, C, C2 : real;
function Fun(x : real) : real;
begin
Fun := (15*x*x*x*x) - (4*x*x*x)-(6*x*x)-(4*x) - 1;
end;
function GetC(a,b : real) : real;
begin
GetC := (Fun(B)*a - Fun(a)*B) / (Fun(B) - Fun(a));
end;
begin
lB := -1;
rB := 0;
ClrScr;
repeat
C := GetC(lB,rB);
if (Fun(lB)*Fun© > 0)
then lB := C
else rB := C;
WriteLn('X = ',C:10:10);
C2 := GetC(lB,rB);
until (abs(C2 - C) < eps);
ReadLn;
end.
klem4
Что может быть не правильно ? Все что тебе надо было сделть, это вставить свое уравнение и граници поиска. huh.gif

Если ты не изменял ничего кроме этого, то все правильно.
mafia1232
" x " получается очень много, уравнение надо простое брать или производную от уравнения?. и еще вопрос :"что такое приближение в методе Ньютона"
volvo
Цитата(mafia1232 @ 29.05.05 11:34)
" x " получается очень много, уравнение надо простое боать или производную от уравнения?

Если бы исходный текст не был изменен, таких вопросов не было бы... А в измененном тексте разбирайтесь самостоятельно... Сумели изменить - ...
mafia1232
справился с хордми по вашему примеру, но так и не понял что такое начальное приближение для метода касательных и как его вычислить. Начальное приближение случайно не начальная точка отсчета до корня или начало отрезка в который входит корень?
volvo
Цитата(mafia1232 @ 29.05.05 11:52)
начало отрезка в который входит корень?
:yes:
klem4
Слушай, ну что с тобой ? там же дальше черным по белому написано
Метод Ньютона(касательных)

прошу прощения, не допонял, ты не не нашел, а не понял в чем там соль да ? ;)
mafia1232
тогда последний вопрос: что дописать к методу Ньютона (основа из вашего макета) что бы он показывал корень, а не переходил к окну программы команда
Код
readln;
не помогает.
а вот сама прога
Исходный код
{$n+}
Program metodnewton;

Function newton(start, Eps: Extended): Extended;
Var
X, prev: Extended;

{ function }
Function F(Arg: Extended): Extended;
Begin
F :=(15*x*x*x*x)-(4*x*x*x)-(6*x*x)-(4*x)-1
End;

{ proizvodnaya }
Function Deriv(Arg: Extended): Extended;
Begin
Deriv := (60*x*x*x)-(12*x*x)-(12*x)-4
End;

Begin
X := start;
Repeat
prev := X;
X := prev - F(prev) / Deriv(prev);
Until Abs(X - prev) <= Eps;
newton := X
End;

Var a, Eps: Extended;

begin
WriteLn('vvedite priblegenie a');
Read(a);
WriteLn('vvedite to4nost Eps');
Read(Eps);
WriteLn('koren raven x= ', newton(a, Eps)10.gif7);
readln;
end.
klem4
Все работает, скорее всего ты вводишь "плохие данные", и где-нибудь получается делиние на 0 или корень из отрицательного ...

а по поводу привильно ли счетает, это опять же, смотря что ты исправлял.
mafia1232
ты не понял он выходит не посредством ошибки, а просто корень не показывает, а показывает только если ты прогу второй раз запускаешь. А считает она правильно.
klem4
Щас в Борланде запущу.

поставь
uses crt;
второй строчкой

хмм странно, не получислось, тогда
uses crt;
в начале, а вместо
readln;
-
repeat until keypressed;
mafia1232
вот прога pascal
mafia1232
Спасибо klem4 ! наконец работает как должна. а куда вставить clrscr?
volvo
Или поменяй Read на ReadLn... Это тоже решит проблему...
klem4
Цитата(mafia1232 @ 29.05.05 12:35)
Спасибо klem4 ! наконец работает как должна. а куда вставить clrscr?


После основного
Begin
mafia1232
Цитата
Или поменяй Read на ReadLn... Это тоже решит проблему
там как раз и был readln
volvo
:no: Ты не понял... Здесь:
WriteLn('vvedite priblegenie a');
Read(a); { <-- Поставь ReadLn }
WriteLn('vvedite to4nost Eps');
Read(Eps); { <-- Поставь ReadLn }
hiv
Не мучайте модуль crt
Проще нажать Alt+F5 и все увидите! :D
klem4
Цитата(hiv @ 31.05.05 15:17)
Не мучайте модуль crt
Проще нажать Alt+F5 и все увидите!  :D


тут не согласен, его желательно всегда подключать :yes: , моного лажи вылезает, когда его нету.

Он всетаки стандартный модуль для клавиатуры и дисплея.

Случай выше - пример, программа работает не так как написно. smile.gif
hiv
У меня нормально работает и без модуля CRT
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.