Консультация № 142063
23.08.2008, 23:58
0.00 руб.
0 1 1
Уважаемые эксперты,помогите с решением задачи пожалуйста. Нужно решить уравнение F:=(x-1)*exp(ln(0.5)*x) двумя методами: методом простых итераций и методом половинного деления. Помогите пожалуйста,буду очень благодарен...

Обсуждение

Неизвестный
24.08.2008, 10:58
общий
это ответ
Здравствуйте, Денисов Игорь Александрович!

Для начала - маленький математический анализ функции: exp(ln(0.5)*x) = exp(ln(0.5)) * exp(x) = 0.5 * exp(x). Экспонента от любого вещественного аргумента - положительна, поэтому нуль функции может давать только первый сомножитель (x - 1). Для ускорения поиска можно было бы оставить только его... но не каждому преподавателю легко объяснить этот факт.

Метод простых итераций сводится к делению всего отрезка, на котором исследуем функцию, на N равных кусочков, и поиску кусочка, на котором функция меняет знак. При нахождении такового выводится середина этого кусочка. Этот метот в принципе может выявить все нули функции на отрезке, если таковые есть.

Метод половинного деления работает по алгоритму: сравниваются знаки на концах исходного отрезка, если они различны, отрезок делится пополам. Выбирается та половина, на концах которой знаки у функции различны, и снова делится пополам. Процедура деления выполняется до тех пор, пока длина очередного отрезка не окажется меньше, чем допустимая погрешность. После этого выводится середина знакопеременного кусочка. Метод работает быстрее первого, но требует уверенности, что на исходном отрезке есть ровно один нуль, и по разные стороны от нуля функция имеет разные знаки.

Приложение:
Program Pr142063;
Uses CRT;

Function F(x: Real): Real;
begin
F := (x - 1) * Exp(ln(0.5)*x);
end;

Var Eps, f1, f2, x, x1, x2, A, B : Real;
N, i: Integer;

Begin
ClrScr;
Repeat
WriteLn('Введите границы интервала: ');
Write('A = '); ReadLn(A);
Write('B = '); ReadLn(b);
if A >= B then WriteLn('Границы интервала заданы некорректно!');
Until A < B;
WriteLn;

Repeat
WriteLn('Укажите необходимую точность вычислений:');
Write('Eps = '); ReadLn(Eps);
if Eps <= 0 then WriteLn('Eps может иметь только положительное значение!');
Until Eps > 0;
WriteLn;

WriteLn('Метод простых итераций:');
N := Round((B - A) / eps + 0.5); x1 := A; f1 := F(x1);
for i := 1 to N do begin
x2 := x1 + (B - A) / N;
f2 := F(x2);
if f1*f2 <= 0 then WriteLn('Нуль функции на x = ', (x2 + x1)/2:12:8);
x1 := x2; f1 := f2;
end;
WriteLn('Выполнено ', N, ' шагов.'); WriteLn;

WriteLn('Метод половинного деления:');
N := 0; x1 := A; x2 := B; f1 := F(x1); f2 := F(x2);
if F(A) * F(B) >= 0
then begin
WriteLn('Невозможно найти нуль функции!');
end else
Repeat
x := (x1 + x2) / 2;
if f1*F(x) <= 0
then begin
x2 := x; f2 := F(x);
end;
if f2*F(x) <= 0
then begin
x1 := x; f1 := F(x);
end;
inc(N);
Until (x2 - x1) < eps;
WriteLn('Нуль функции на x = ', (x2 + x1)/2:12:8);
WriteLn('Выполнено ', N, ' шагов.');

ReadLn;
End.
Форма ответа