| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3786 人关注过本帖
标题:关于数学题arcsinx的求解
取消只看楼主 加入收藏
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:3 
关于数学题arcsinx的求解
前两天发了帖子获取思路,Amy_huyier网友回帖给予了好几个解法,我前天试了试,但是用二分法在迭代过程出现了一些问题
刚刚我使用另外一种定积分定义进行了运算,成功得到了arcsinx的结果,误差基于在进行分割0到x区间的n值的大小,我选择n=10000000,误差缩小到了1e-4,
求解平方根的迭代不需要太大,我一开始设置很大,发觉没必要并且机器已经反应不过来。。。。。。cpu利用率疯狂飙升
后来经过调试n=10就可以把平方根精确到大约1e-6次方的精度了。(囧了。。。刚才改了一下,其实只要迭代10次精度都可以达到很高要求。。。)
现在发觉高数还真没白学。。。大家一起好好学各种数学哇~~~~~
下面紧跟是成功用定积分定义求出的arcsinx,在下面一贴是我前几天失败的案例,希望大家有时间帮我看看哪里出了问题,非常感谢
程序代码:
#include <stdio.h>
#include <math.h>

int main()
{
    double sqr(double a);
    double arcsin(double x);
    double x;
    scanf("%lf",&x);
    printf("mine arcsinx = %lf\n\"math.h\"asinx = %lf\n",arcsin(x),asin(x));
    return 0;
}
double sqr(double a)//迭代法求根号a
{
    double y=a;
    long n=10;//改为10
    do
    {
    y = (y+a/y)/2;
    n--;
    }while(n>0);
    return y;
}
double inside(long i,long n,double x)
{
    return 1/sqr(1-(i*x/n)*(i*x/n));
}
double arcsin(double x)//使用积分定义算1/sqtr(1-x*x)的积分,积分下限为0,上限为x,积分完成后返回arcsinx的值
{
    double result=0;
    long i=0,n=10000000;//0到x的区间分成n份
    double outside=x/n;
    while(i<n)
    {
        result += outside*inside(i,n,x);
        i++;
    }
    return result;
}



[ 本帖最后由 baobaoisme 于 2011-2-28 20:10 编辑 ]
搜索更多相关主题的帖子: 数学题 二分法 平方根 
2011-02-28 20:01
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:0 
失败的案例
程序代码:
#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;
}

2011-02-28 20:02
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:0 
回复 3楼 pangding
非常感谢,貌似研一还要开计算方法这门课,希望以后有机会好好学习一下。。。。。
2011-03-01 12:59
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:0 
回复 5楼 pangding
恩,我本科就是计算机科学与技术专业,考的也是本专业了
2011-03-01 22:08
快速回复:关于数学题arcsinx的求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013630 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved