| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 608 人关注过本帖
标题:用迭代法求x
只看楼主 加入收藏
troyzyc
Rank: 1
等 级:新手上路
帖 子:108
专家分:0
注 册:2016-7-4
结帖率:56.6%
收藏
已结贴  问题点数:6 回复次数:3 
用迭代法求x
这个程序是正确的,用迭代法求x=sqrt(a)的程序。
#include <stdio.h>
#include <math.h>
int main()
 {
     double x1,x2,a;
     scanf("%lf",&a);
     x1=a/2;
     x2=0.5*(x1+a/x1);
     while(fabs(x1-x2)>=1e-5)
     {
         x1=x2;
         x2=0.5*(x1+a/x1);        
     }
     printf("%lf",x2);
    return 0;
 }

但我自己写的时候,没有“ x2=0.5*(x1+a/x1); ”这一句,我就不明白为什么要在while循环外写一句这个赋值式子?直接进入while循环不好吗?
#include <stdio.h>
#include <math.h>
int main()
 {
     double x1,x2,a;
     
     scanf("%lf",&a);
     x1=a/2;

     while(fabs(x1-x2)>=1e-5)
     {
         
         x1=x2;
         x2=0.5*(x1+a/x1);        
     }
     printf("%lf",x2);
    return 0;
 }
搜索更多相关主题的帖子: include double return 
2017-02-16 22:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
先回答楼主的问题~这个推敲一下逻辑结构就行了~
受到楼主代码启发~自己写了个开3次方的代码~和加以验证~

PS:x2在执行循环之前要赋予初值~

程序代码:
#include <stdio.h>
#include <math.h> 
int main()

 {
     double x1,x2,a;
     scanf("%lf",&a);
     x1=a/2;
     x2=(x1+a/(x1*x1))/2;
     while(fabs(x1-x2)>=1e-5)
     {
         x1=x2;
         x2=(x1+a/(x1*x1))/2;        
     }
     printf("%.4f\n",x2);
     printf("%.4f\n",pow(x2,3));
    return 0;

 }


[此贴子已经被作者于2017-2-16 22:57编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-16 22:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
突然发现这样迭代法开高次方效率太低了~精度太小运行次数过多约等于"死循环"~试试用"牛顿迭代法"~哎呀~要顺便复习一下才行~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-16 22:54
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
用一楼的方法开高次方的话会因为循环次数太多而陷入"死循环"~于是九九用牛顿迭代法写了个开高次方的程序~顺便复习一下牛顿迭代法~

程序代码:
#include<stdio.h>
#include<math.h>
#define K 1e-5
double fun(double x,double k,int n)
{
    return pow(x,n)-k;
}

double fun_2(double x,int n)
{
    return n*pow(x,n-1);
}
int main()
{
    int n=0;
    
    double x=1;
    double k=0;
    double y1=0;
    double y2=0;
    double b=0;

    printf("请输入被开方数和开的次方数:\n");
    scanf("%lf%d",&k,&n);
    
    do
    {
         y1=fun(x,k,n);
         y2=fun_2(x,n);    
         b=y1-y2*x;

        x=-b/y2;

    }while (fabs(y1)>K);
    
    printf("%lf\n",x);
    
    return 0;
}

PS:关于牛顿迭代法可以参考~
https://bbs.bccn.net/thread-473744-1-1.html
PPS:上面那个是九九以前发帖的~如果要更详细的资料就上网搜搜~~

[此贴子已经被作者于2017-2-16 23:28编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-16 23:27
快速回复:用迭代法求x
数据加载中...
 
   



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

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