Продолженный дробный натуральный логарифм (количество итераций, необходимое для вычисления правильного логарифма)
У меня проблема с моим алгоритмом продолжения дроби для натурального логарифма. Мне нужно вычислить натуральный логарифм, например, ln(0,31) с точностью до 1e-6 за 6 итераций, мой алгоритм сделает это за 8.
Это моя реализация:
#include<stdio.h>
#include<math.h>
#include<string.h>
double c_frac_log(double x, unsigned int n)
{
double z=(x-1)/(x+1);
double zz = z*z,res=0;
double cf = 1;
for (int i = n; i >= 1; i--)
{
cf = (2*i-1) - i*i*zz/cf;
}
res=2*z/cf;
return res;
}
int c_frac_eps(double x,double eps)
{
int a=0;
double loga=log(x),fraclog=c_frac_log(x,a);
double roz=(loga-fraclog);
roz=fabs(roz);
for(a=0;roz >= eps;a++)
{
fraclog=c_frac_log(x,a);
roz=(loga-fraclog);
roz=fabs(roz);
}
return a-1;
}
int main()
{
double x=0.31,eps=0.000001;
printf("c_frac_log (%0.4f) =%0.12f \n",x,c_frac_log(x,c_frac_eps(x,eps)));
printf("math.h - log(%0.4f)=%0.12f\n",x,log(x));
printf("minimum of iterations with accuracy %f is %d\n",eps,c_frac_eps(x,eps));
return 0;
}
Кто-нибудь из вас имеет представление, как улучшить мой код?
1 ответ
Начальный cf
влияет на конечный результат - немного.
В предыдущем комментарии обнаружил, что cf = 1.88*n-0.95;
дал лучший результат, чем double cf = 1;
Это было найдено путем изменения алгоритма и нахождения корреляции с n
, YMMV.
Оригинальные результаты
c_frac_log (0.3100) =-1.171182812362
math.h - log(0.3100)=-1.171182981503
minimum of iterations with accuracy 0.000001 is 8
С этим изменением
c_frac_log (0.3100) =-1.171183069158
math.h - log(0.3100)=-1.171182981503
minimum of iterations with accuracy 0.000001 is 6
6 бьет 8 и отвечает ОП "в 6 итераций".
Примечание: тип согласованности:
double c_frac_log(double x, unsigned int n) {
...
// for (int i = n; i >= 1; i--) {
for (unsigned i = n; i >= 1; i--) {