Вычисление функции в Mathcad 14
От: insanekoder http://insanesoft.ru
Дата: 11.04.08 16:08
Оценка:
Имеется следующая функция:



Необходимо вычислить ее значение при n = 1..500.

Все хорошо считается если n <= 133. Но дальше маткад просто ничего не считает и выводит сообщение: "Encountered a floating point error".

В справке относительно этого пишут следующее:

You are evaluating a function at a point that is not allowed. For example, the fifth argument to the relax function in Mathcad cannot have zeros in the non-boundary positions of the coefficient matrix.


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

Если у кого-то есть свои соображения по этому поводу, отпишите. Буду благодарен .
Re: Вычисление функции в Mathcad 14
От: ilnar Россия  
Дата: 11.04.08 16:44
Оценка:
Здравствуйте, insanekoder, Вы писали:

I>Имеется следующая функция:


I>



I>Если у кого-то есть свои соображения по этому поводу, отпишите. Буду благодарен .


упрости, ...
Re[2]: Вычисление функции в Mathcad 14
От: insanekoder http://insanesoft.ru
Дата: 11.04.08 16:48
Оценка:
Здравствуйте, ilnar, Вы писали:

I>упрости, ...


как? все равно слишком большие числа получаются...
Re[3]: Вычисление функции в Mathcad 14
От: Аноним  
Дата: 11.04.08 17:15
Оценка: 1 (1)
Здравствуйте, insanekoder, Вы писали:

I>Здравствуйте, ilnar, Вы писали:


I>>упрости, ...


I>как? все равно слишком большие числа получаются...


 n
 П  4i/n
i=1
Re[3]: Вычисление функции в Mathcad 14
От: ilnar Россия  
Дата: 11.04.08 17:38
Оценка: 2 (1)
Здравствуйте, insanekoder, Вы писали:

I>Здравствуйте, ilnar, Вы писали:


I>>упрости, ...


I>как? все равно слишком большие числа получаются...


внутри перемножение при i= от 1 до n: (4*1/n)*(4*2/n)*..*(4*n/n)
там наверняка есть перемножение в виде буквы П

и вообще log(4^n,2)=2*n
твоя формула: 2*n + log[(1/n)*(2/n)*..*(n/n), 2]
но так удается вычислить только до n=747 (на с++ с double)

а если в изначальном:
log[(4*1/n)*(4*2/n)*..*(4*n/n), 2]
то до n=1825
results1.txt

можно пойти дальше:
n + log[(2*1/n)*(2*2/n)*..*(2*n/n), 2]
так до n = 2444
results2.txt

http://files.rsdn.ru/982/results.zip

скорее можно вычислить оптимальный коэффециент вместо 4 и соответствующее ему слагаемое и вычислить значения для больших n
Re[4]: Вычисление функции в Mathcad 14
От: insanekoder http://insanesoft.ru
Дата: 11.04.08 18:55
Оценка:
Здравствуйте, ilnar, Вы писали:

I>там наверняка есть перемножение в виде буквы П


Спасибо , забыл что есть такая штука .
Re: Вычисление функции в Mathcad 14
От: vadimcher  
Дата: 11.04.08 19:46
Оценка:
Здравствуйте, insanekoder, Вы писали:

I>Имеется следующая функция:


I>


I>Необходимо вычислить ее значение при n = 1..500.


Можно, конечно, просто представить логарифмы произведений в виде суммы логарифмов, а можно пойти другой дорогой.

x(n+1)-x(n)
= [2(n+1) + ld(1)+...+ld(n+1) — (n+1)*ld(n+1)] — [2n + ld(1)+...+ld(n) — n*ld(n)]
= 2 — n*ld(n+1) + n*ld(n)
= 2 — n * ld(1 + 1/n)

Начинаем с x(1)=2, а далее для каждого n=1,2,... высчитываем x(n+1) = x(n) + 2 — n * ld(1 + 1/n).

Кстати, разница x(n+1)-x(n) очень быстро сойдется к числу < 1, а потому посчитать так можно для ОЧЕНЬ больших n.

А вот зайца кому, зайца-выбегайца?!
Re[2]: Вычисление функции в Mathcad 14
От: vadimcher  
Дата: 11.04.08 20:10
Оценка: 2 (1)
Здравствуйте, vadimcher, Вы писали:

V>Здравствуйте, insanekoder, Вы писали:


I>>Имеется следующая функция:


I>>


I>>Необходимо вычислить ее значение при n = 1..500.


V>Можно, конечно, просто представить логарифмы произведений в виде суммы логарифмов, а можно пойти другой дорогой.


V>x(n+1)-x(n)

V> = [2(n+1) + ld(1)+...+ld(n+1) — (n+1)*ld(n+1)] — [2n + ld(1)+...+ld(n) — n*ld(n)]
V> = 2 — n*ld(n+1) + n*ld(n)
V> = 2 — n * ld(1 + 1/n)

V>Начинаем с x(1)=2, а далее для каждого n=1,2,... высчитываем x(n+1) = x(n) + 2 — n * ld(1 + 1/n).


V>Кстати, разница x(n+1)-x(n) очень быстро сойдется к числу < 1, а потому посчитать так можно для ОЧЕНЬ больших n.


Вот программка:
#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

void main(void) {
    double x = 2;
    int n = 1;
    ofstream ofil("abc.txt");
    while (n <= 100000) {
        ofil << "n: " << n << ", x: " << x << '\n';
        x += 2 - n * log(1 + 1 / (double)n) / log(2.);
        n++;
    }
    ofil.close();
}

Для всех n от 1 до n=100,000 просчитала где-то за секунду. При этом "n: 133, x: 78.9759" -- все правильно.

А вот зайца кому, зайца-выбегайца?!
Re[3]: Вычисление функции в Mathcad 14
От: insanekoder http://insanesoft.ru
Дата: 11.04.08 20:25
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Для всех n от 1 до n=100,000 просчитала где-то за секунду. При этом "n: 133, x: 78.9759" -- все правильно.


Спасибо, но это уже оверкил .
Re: Вычисление функции в Mathcad 14
От: Константин Россия  
Дата: 11.04.08 22:25
Оценка: 2 (1)
Здравствуйте, insanekoder, Вы писали:

I>Имеется следующая функция:


I>


I>Необходимо вычислить ее значение при n = 1..500.


Ну и за компанию, приближённая формула.
Возьмём формулу Стирлинга.

После преобразований получим
x(n)=1/ln2 * ( n(ln(4)-1)+ln(n)/2+ln(2*pi)/2)


Ошибка
0< err(n) < 1/(12*ln(2)*n)

Точность можно существенно улучшить, если взять несколько членов в разложении.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.