17.05.2008, 12:28
общий
это ответ
<i>Здравствуйте, <b>Денисов Игорь Александрович</b>!</i>
В приложении находятся примеры решения данного уравнения методом половинного деления и методом Ньютона (касательных).
Информацию про методы я взял здесь: <a target=_blank href=http://elib.ispu.ru/library/math/sem1/index.html>Высшая математика. Первый семестр</a>.
Комментарии к первому примеру:
В примере <i>N</i> - количество итераций, необходимое для получения результата с точностью, равной <i>eps</i>.
<i>N</i> расчитывается по формуле:
<code>N = |log<sub>2</sub>((b-a)/(2*eps))|</code>
Комментарии ко второму примеру:
<i>Fp(x)</i> - это производная функции <i>F(x)</i>.
Если я правильно понял, то
<code>F(x) = (x-1)<sup>2</sup> - 0,5<sup>x</sup></code>
а ее производная, если я правильно посчитал
<code>F‘(x) = 2*(x-1) - 0,5<sup>x</sup>*ln(0,5)</code>
Если я неправильно посчитал производную, то пересчитайте и измените функцию <i>Fp(x)</i> - я уже давно производных не считал, и боюсь, что где-нибудь мог допустить ошибку.
<em>Удачи!</em>
Приложение:
###### Метод половинного деления ######program Q137159_1;{$N+}uses Crt; function F(const x: Double): Double;begin F:= (x-1)*(x-1)-exp(ln(0.5)*x);end;var a, b, c: Double; fa, fb, fc: Double; eps: Double; N: Integer;begin {ЋзЁбвЄ нЄа } ClrScr; {‡ Їа иЁў Ґ¬ г Ї®«м§®ў вҐ«п ¤Ё Ї §® Ї®ЁбЄ } writeln(‘‚ўҐ¤ЁвҐ ¤Ё Ї §® Ї®ЁбЄ [a, b]:‘); write(‘a = ‘); readln(a); write(‘b = ‘); readln(b); fa:= F(a); fb:= F(b); if (((fa < 0.0) and (fb < 0.0)) or ((fa > 0.0) and (fb > 0.0)) or (a >= b)) then begin writeln(‘‚л ўўҐ«Ё ҐўҐалҐ § 票п a Ё b‘); readln; Halt(0); end; {‡ Їа иЁў Ґ¬ в®з®бвм} write(‘’®з®бвм Ї®ЁбЄ = ‘); readln(eps); if (eps <= 0.0) then begin writeln(‘‚л ўўҐ«Ё ҐЇа ўЁ«м®Ґ § 票Ґ в®з®бвЁ Ї®ЁбЄ !‘); readln; Halt(0); end; N:= Round(abs(ln((b - a)/(2*eps))/ln(2))); c:= (a + b)/2; fc:= F(c); while ((fc <> 0.0) and (N > 0)) do begin Dec(N); if (((fa > 0.0) and (fc < 0.0)) or ((fa < 0.0) and (fc > 0.0))) then begin b:= c; fb:= fc; end else begin a:= c; fa:= fc; end; c:= (a + b)/2; fc:= F(c); end; {‚лў®¤ १г«мв в } writeln; writeln(‘x = ‘, c:1:6); writeln(‘F(x) = ‘, fc:1:6); {Ћ¦Ё¤ ЁҐ ¦ вЁп Ї®«м§®ў ⥫Ґ¬ «оЎ®© Є®ЇЄЁ} WriteLn; WriteLn(‘Press any key...‘); ReadLn;end.###### Метод Ньютона (касательных) ######program Q137159_2;{$N+}uses Crt; function Fp(const x: Double): Double;begin Fp:= 2*x - exp(ln(0.5)*x)*ln(0.5) - 2;end; function F(const x: Double): Double;begin F:= (x-1)*(x-1)-exp(ln(0.5)*x);end;var xi, xi1, fxi: Double; eps: Double;begin {Очистка экрана} ClrScr; {Запрашиваем у пользователя диапазон поиска} writeln(‘Введите начальное значение‘); write(‘x0 = ‘); readln(xi); {Запрашиваем точность} write(‘Точность поиска = ‘); readln(eps); if (eps <= 0.0) then begin writeln(‘Вы ввели неправильное значение точности поиска!‘); readln; Halt(0); end; fxi:= F(xi); xi1:= xi - fxi/Fp(xi); while ((fxi <> 0.0) and (abs(xi1 - xi) > eps)) do begin xi:= xi1; fxi:= F(xi); xi1:= xi - fxi/Fp(xi); end; {Вывод результата} writeln; writeln(‘x = ‘, xi:1:6); writeln(‘F(x) = ‘, fxi:1:6); {Ожидание нажатия пользователем любой кнопки} WriteLn; WriteLn(‘Press any key...‘); ReadLn;end.