![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с оптимизацией [D7, WinXP]
Dragon-zla © (2009-10-06 22:36:00)Здравствуйте, помогите пожалуйста с оптимизацией кода
Задача состоит в решении уравнения F(x)=0 на отрезке [a,b] с заданной точностью e методом деления отрезка пополам и выводом найденного решения на экран.
Точность = 1e-0,5 (0.00001)
Отрезок [-0.5;3]
Уравнение (1/(sqrt(5)+sin(0.1*x)+ln(1+x))-x)
Код я написал, он компилируется, запрашивает исходные данные, начинает выполнять код, а вот потом ОЧЕНЬ медленно приближается к заданной точности. Подскажите пожалуйста можно оптимизировать его, для ускорения вычисления или это мне с примером "повезло"?
P.S. пробовал изменить точность до 0.1 - бессмысленно
Собственно сам код:
program ecsAdd1_4;
{$APPTYPE CONSOLE}
uses
SysUtils,crt32,Math;
const
epsil = 0.00001;
var
a,b,c,Fa,Fb,Fc : real;
begin
writeln(oem('Введите начальное значение отрезка'));
readln(a);
writeln(oem('Введите конечное значение отрезка'));
readln(b);
while abs(b-a)>epsil do
begin
if a*b<0 then
c := (a+b)/2
else
c := (a-b)/2;
Fa := (1/(sqrt(5)+sin(0.1*a)+ln(1+a))-a);
Fb := (1/(sqrt(5)+sin(0.1*b)+ln(1+b))-b);
Fc := (1/(sqrt(5)+sin(0.1*c)+ln(1+c))-c);
if Fa*Fc<0 then
b := c
else
a := c;
end;
Fa := (1/(sqrt(5)+sin(0.1*a)+ln(1+a))-a);
Fb := (1/(sqrt(5)+sin(0.1*b)+ln(1+b))-b);
if Fa*Fb<0 then begin
if a*b<0 then
c := (a+b)/2
else
c := (a-b)/2;
Fc := (1/(sqrt(5)+sin(0.1*c)+ln(1+c))-c);
writeln(oem('Приблизительный корень уравнения = ') ,c);
writeln(oem('Значение функции в этой точке = ') ,Fc);
readkey;
end
else
writeln(oem('Корень не найден'));
readkey;
end.
Омлет (2009-10-07 00:11:00) [1]У тебя неправильная реализация.
Первая ссылка в яндексе (даже с кодом): http://eco.sutd.ru/Study/Informat/mpd.html
palva (2009-10-06 23:52:00) [2]
if a*b<0 then
c := (a+b)/2
else
c := (a-b)/2;
Можете объяснить на словах, что это такое?