Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Вычисление Логарифма с заданной точностью

Автор: TOPEHTO 7.11.2006 22:45

Помоги плиз... надо вычислить Натуральный Логарифм числа 2 с заданной точностью. финкция раскладывается так Ln(1+x)=E(-1)^n+1 * (X^n)/n
E это типа сигма... smile.gif ...так вот число 2 мы представляем как Ln(1+1) и расписываем по формуле. Пользователь вводит точность, т.е. количество слагаемых по которым будет разложен ряд. т.е. например ввел число 2 то 1-1/2 и все...

Цитата
function _Ln(x: double): double;
const eps = 0.0000001; { Задаем точность }
var
s, next: double;
n: integer;
begin
next := (x - 1)/(x + 1);
s := next; n := 1;
repeat
inc(n, 2);
next := (next * sqr(x - 1))/sqr(x + 1);
s := s + next/n;
until (next/n) < eps;
_Ln := 2 * s
end;

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

Автор: arhimag 7.11.2006 22:48

а если сделать так?

function _Ln(x: double; eps: double): double;
var

Автор: volvo 7.11.2006 22:48

Цитата
не хватает мозга, чтобы прога работала
А для этого тебе никакого мозга и не надо... Ты ж не пишешь функцию, а копируешь ее... Для того, чтоб она заработала (а она - рабочая, я в FAQ других не выкладываю), тебе нужен не МОЗГ, а КОМПИЛЯТОР...

Цитата
но не получается уменя переделать погрешность
То есть, ты не в состоянии поменять значение Eps даже? Тогда что ты от нас хочешь? Чтоб мы приехали к тебе и сдали эту программу за тебя?

Сделай так:
const eps: double = 0.0000001; { Задаем точность }

function _Ln(x: double): double;
...


archimag, сможешь объяснить 2 вещи?
1) почему я вынес Eps ПЕРЕД реализацией функции
2) что мне дало добавление :double ?

(просьба на эти 2 вопроса отвечать именно archimag-а, и никого более)...

Автор: TOPEHTO 7.11.2006 22:56

Значение Еps Я переделал, Я не это имелл ввиду...мне как бы так сказать, эта погрешность вообще не нужна, мне нужна что ф-ция раскладывалась в такой ряд и пользователь только вводил кол-во слагаемых...т.е. само Еps мне не нужно... wink.gif ...

Автор: arhimag 7.11.2006 22:57

Volvo, ты знаешь, ответ : не знаю
я просто предложил ( не проверяя ) поэтому и не писал что это точно будет работать...

Автор: мисс_граффити 7.11.2006 22:58

ТOPEHTO, замени цикл на for. или просто условие другое сделай - не привязанное к eps, а зависящее от кол-ва выполненных проходов.

Автор: TOPEHTO 7.11.2006 23:05

мисс_граффити
ЗАменил...но чето не пашет...ты понимаешь смысл в том что, если Я задаю 2 прохода то ответ должен быть 0,5 а у меня 6.666 и т.д. получается, сейчас сижу думаю вот... wink.gif ...

Автор: volvo 7.11.2006 23:17

TOPEHTO, ты напиши, чего ты хочешь? КАК ты бы хотел вызывать функцию? ЧТО переделывать-то требуется? Сначала ты говоришь, что проблема в точности, сейчас выясняется что не совсем...

Да, кстати:

Цитата
финкция раскладывается так Ln(1+x)=E(-1)^n+1 * (X^n)/n
Ты уверен? Это разложение - когда -1<X<=1... У тебя же Х=2, так что будь добр раскладывать по правильной формуле...

Автор: мисс_граффити 7.11.2006 23:48

Цитата(volvo @ 7.11.2006 19:17) *

Ты уверен? Это разложение - когда -1<X<=1... У тебя же Х=2, так что будь добр раскладывать по правильной формуле...

ln(2)=ln(1+1)=ln(1+x)
x=1
что не так?

Автор: volvo 8.11.2006 0:34

Да? Только вот автор почему-то приводит одну формулу, а считает по другой, с чего бы это? Подсчет-то идет по формуле, где X > 0... Если делает свой велосипед, пускай и колеса на него свои ставит, чего чужие-то брать?

Автор: TOPEHTO 8.11.2006 3:40

volvo
мисс_граффити прав, точнее Я не наю на сколько, но нам сегодня сказали считать так, ln2=ln(1+1) и вперед, а что касается считать по этой формуле, то Я переделываю по тихоньку программу, но к сожалению не получается...поэтому и прошу вашей помощи. Да, согласен что надо считать по правильной фор-ле, но препод сказала так, значит надо так... wink.gif ...

Автор: мисс_граффити 8.11.2006 4:22

мдя...
после такого оскорбления я явно в этой теме писать не буду.

а вообще такого рода программки проще не переделывать, а писать с нуля - если хочешь что-то понять. Или брать готовыми - если не хочешь.
Подумай логически (я про знания паскаля не говорю). Надо посчитать ряд. (кстати, там после -1 должен идти не +, а *. и степень не n, а n+1.... хотя могу ошибаться). Известен общий член ряда. Сколько таких чисел взять - известно (напрашивается цикл for, не так ли?). Осталось просто просуммировать....

volvo, сорри.

Автор: TOPEHTO 8.11.2006 22:12

Народ, чтобы не создавать новую тему, может подскажете, еще надо вычисление числа ПИ с заданным кол-вом слагаемых, через разложение арктангенса...вот так вот... wink.gif ...

Автор: klem4 8.11.2006 22:22

Посмотри http://www.kamlit.ru/docs/aloritms/algolist.manual.ru/maths/count_fast/pi.php

И всетаки не стоит задавать свои вопросы в чужих темах.

Автор: TOPEHTO 8.11.2006 22:37

klem4
пасиб конечно, но чтото это мне както не помогло...не знаю, или Я думаю не так...
А тема моя вообще, просто не хочу лишних создавать... wink.gif ...