求一数学题思路
题目要求反正弦arcsinx,但是不能用头文件math.h中的函数,最后只是用库函数来验证我一开始想用泰勒公式解决,后来发现arcsinx的n次导数似乎没有什么规律
各位有什么好的思路,真心求教
程序代码:#include <stdio.h>
#include <math.h>
int fact(int);
double xn(double,int);
double Sin(double);
double f(double,double);
double arcsin(double,double,double);
int main()
{
double x,a,b;
printf("请输入arcsinx中所要求的x的值:\n");
scanf("%lf",&x);
printf("请输入符合条件的a与b的值:\n");
scanf("%lf%lf",&a,&b);
while (f(a,x)*f(b,x)>0)
{
printf("不符合条件,请重新输入a与b的值:\n");
scanf("%lf%lf",&a,&b);
}
printf("%lf %lf",arcsin(a,b,x),asin(x));
return 0;
}
double arcsin(double a,double b,double x)//返回arcsinx的值,即返回使f(y)=0方程的解
{
double c=(a+b)/2.0;
while (fabs(a-b)>1e-8)//二分法求根,精度设置
{
if (f(c,x)*f(a,x)>1e-6)
a=c;
else
b=c;
c=(a+b)/2.0;
}
//printf("f(y)=%lf\n",f(c,x));
return c;
}
double f(double y,double x)//求解函数f(y)=siny-x
{
return Sin(y)-x;
}
double Sin(double x)//级数展开sinx
{
int flag=1;
double result=0;
int n=0;
while ( (xn(x,2*n+1)/fact(2*n+1)) > 1e-6 )//精度设置
{
result += (xn(x,2*n+1)/fact(2*n+1))*flag;
flag=-flag;
n++;
}
return result;
}
double xn(double x,int n)//求x的n次方
{
while (n>1)
{
x=x*x;
n--;
}
return x;
}
int fact(int n)//求阶乘
{
int result=1;
while (n>0)
{
result *= n;
n--;
}
return result;
}
我想用二分法求根,sinx的级数展开等函数经过验证与库函数算出的值均相等