我有一点问题。从这个公式创建一些东西:
这就是我所拥有的,但它并不起作用。弗兰基,我真的不明白它应该如何运作......我试着用一些不好的指示来编码它。 N是迭代次数和分数的部分。我认为它以某种方式导致递归,但不知道如何。
感谢您的帮助。
double contFragLog(double z, int n)
{
double cf = 2 * z;
double a, b;
for(int i = n; i >= 1; i--)
{
a = sq(i - 2) * sq(z);
b = i + i - 2;
cf = a / (b - cf);
}
return (1 + cf) / (1 - cf);
}
答案 0 :(得分:2)
中央循环混乱。返工。也不需要递归。只需先计算最深的术语,然后逐步解决问题。
double contFragLog(double z, int n) {
double zz = z*z;
double cf = 1.0; // Important this is not 0
for (int i = n; i >= 1; i--) {
cf = (2*i -1) - i*i*zz/cf;
}
return 2*z/cf;
}
void testln(double z) {
double y = log((1+z)/(1-z));
double y2 = contFragLog(z, 8);
printf("%e %e %e\n", z, y, y2);
}
int main() {
testln(0.2);
testln(0.5);
testln(0.8);
return 0;
}
输出
2.000000e-01 4.054651e-01 4.054651e-01
5.000000e-01 1.098612e+00 1.098612e+00
8.000000e-01 2.197225e+00 2.196987e+00
[编辑]
根据@MicroVirus的提示,我发现double cf = 1.88*n - 0.95;
的效果优于double cf = 1.0;
。随着使用更多术语,使用的值会产生较小的差异,但良好的初始cf
需要较少的术语才能获得良好的答案,尤其是对于接近0.5的|z|
。在我研究0 < z <= 0.5
时,可以在这里做更多的工作。 @MicroVirus对2*n+1
的建议可能与我的建议很接近,因为n
已经过了一段时间。
这是基于反向计算,并注意CF[n]
的值增加n
。我很惊讶种子&#34;值似乎不是一个很好的整数方程式。
答案 1 :(得分:0)
这是解决使用递归的问题的解决方案(如果有人感兴趣的话):
#include <math.h>
#include <stdio.h>
/* `i` is the iteration of the recursion and `n` is
just for testing when we should end. 'zz' is z^2 */
double recursion (double zz, int i, int n) {
if (!n)
return 1;
return 2 * i - 1 - i * i * zz / recursion (zz, i + 1, --n);
}
double contFragLog (double z, int n) {
return 2 * z / recursion (z * z, 1, n);
}
void testln(double z) {
double y = log((1+z)/(1-z));
double y2 = contFragLog(z, 8);
printf("%e %e %e\n", z, y, y2);
}
int main() {
testln(0.2);
testln(0.5);
testln(0.8);
return 0;
}
输出与上述解决方案相同:
2.000000e-01 4.054651e-01 4.054651e-01
5.000000e-01 1.098612e+00 1.098612e+00
8.000000e-01 2.197225e+00 2.196987e+00