Sin Taylor 级数递归逼近
Sin taylor series recursive approximation
我需要了解我计算 sin 泰勒级数的递归方法,但该方法无法正常工作。该方法调用另外两个递归方法,即递归 pow 方法和递归阶乘方法。我将我的发现与迭代 sin 方法进行了比较,给出了正确的解决方案。我的递归 sin 方法缺少什么?
Approximation of sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...
public class SinApprox
{
public static void main (String [] args)
{
Out.println(sinx(1, 1, 2, 1, 1, 0, 1));
Out.print(sinIT(2));
}
static double sinIT(double x)
{
double sin = 0;
double a = x;
double b = 1;
double term = a/b;
double vz = 1;
double i = 1;
while(term > 0.000001)
{
i = i +2;
sin = sin + (term*vz);
a= rekursivPow(x,i);
b = rekursivN(i);
term = a/b;
vz = -1 * vz;
}
return sin;
}
static double rekursivN(double n)
{
if(n==1)
{
return 1;
}
return n * rekursivN(n-1);
}
static double rekursivPow(double x , double y)
{
if(y == 1)
{
return x ;
}
return x * rekursivPow(x , y - 1);
}
static double sinx(double i ,double n, double x, double y, double vz, double sum, double pow)
{
double term = pow / n;
if(term > 0.000001)
{
sum = sum + (term * vz);
vz = -1 * vz;
i = i +2;
n = rekursivN(i);
y = y +2;
pow = rekursivPow(x ,y);
return sinx(i, n, x , y , vz, sum, pow);
}
return sum;
}
}
第一步是以递归关系清晰的方式编写函数(你不能为不清楚的地方编写代码)所以,不要从这个开始:
sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...
而是问 "how can I make all those terms with x
look the same":
sin(x)= x^1/1! - x^3/3! + x^5/5! + ...
良好的开端,但如果我们递归,我们真正要寻找的是 仅 计算其中一项,然后使用更新的参数调用自身计算下一项。理想情况下,我们想要这样的东西:
doThing(args) {
return simpleComputation() + doThings(updatedargs);
}
然后递归完成剩下的工作。因此,让我们首先确保我们只需要处理 +
而不是 +
和 -
:
的混合
sin(x)= (-1)^0 * x^1/1! + (-1)^1 * x^3/3! + (-1)^2 * x^5/5! + ...
现在您有了可以实际表示为递归关系的东西,因为:
sin(x,n) {
return (-1)^n * x^(2n+1) / (2n+1)! + sin(x, n+1);
}
使用"shortcut"函数:
sin(x) {
return sin(x,0);
}
提示到此为止,您应该能够自己实施其余部分。只要你记得停止递归,因为泰勒级数是无限的,而计算机程序和资源不是。
我需要了解我计算 sin 泰勒级数的递归方法,但该方法无法正常工作。该方法调用另外两个递归方法,即递归 pow 方法和递归阶乘方法。我将我的发现与迭代 sin 方法进行了比较,给出了正确的解决方案。我的递归 sin 方法缺少什么?
Approximation of sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...
public class SinApprox
{
public static void main (String [] args)
{
Out.println(sinx(1, 1, 2, 1, 1, 0, 1));
Out.print(sinIT(2));
}
static double sinIT(double x)
{
double sin = 0;
double a = x;
double b = 1;
double term = a/b;
double vz = 1;
double i = 1;
while(term > 0.000001)
{
i = i +2;
sin = sin + (term*vz);
a= rekursivPow(x,i);
b = rekursivN(i);
term = a/b;
vz = -1 * vz;
}
return sin;
}
static double rekursivN(double n)
{
if(n==1)
{
return 1;
}
return n * rekursivN(n-1);
}
static double rekursivPow(double x , double y)
{
if(y == 1)
{
return x ;
}
return x * rekursivPow(x , y - 1);
}
static double sinx(double i ,double n, double x, double y, double vz, double sum, double pow)
{
double term = pow / n;
if(term > 0.000001)
{
sum = sum + (term * vz);
vz = -1 * vz;
i = i +2;
n = rekursivN(i);
y = y +2;
pow = rekursivPow(x ,y);
return sinx(i, n, x , y , vz, sum, pow);
}
return sum;
}
}
第一步是以递归关系清晰的方式编写函数(你不能为不清楚的地方编写代码)所以,不要从这个开始:
sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...
而是问 "how can I make all those terms with x
look the same":
sin(x)= x^1/1! - x^3/3! + x^5/5! + ...
良好的开端,但如果我们递归,我们真正要寻找的是 仅 计算其中一项,然后使用更新的参数调用自身计算下一项。理想情况下,我们想要这样的东西:
doThing(args) {
return simpleComputation() + doThings(updatedargs);
}
然后递归完成剩下的工作。因此,让我们首先确保我们只需要处理 +
而不是 +
和 -
:
sin(x)= (-1)^0 * x^1/1! + (-1)^1 * x^3/3! + (-1)^2 * x^5/5! + ...
现在您有了可以实际表示为递归关系的东西,因为:
sin(x,n) {
return (-1)^n * x^(2n+1) / (2n+1)! + sin(x, n+1);
}
使用"shortcut"函数:
sin(x) {
return sin(x,0);
}
提示到此为止,您应该能够自己实施其余部分。只要你记得停止递归,因为泰勒级数是无限的,而计算机程序和资源不是。