标题:我做了一个晚上,还是想不出问题所在,有能解决的,给我个提示
只看楼主
留下
Rank: 1
等 级:新手上路
帖 子:3
专家分:6
注 册:2012-10-25
得分:1 
#include<stdio.h>
#include<math.h>
double f(double x)
{           
     double y;
     y=0.5*log(4-x);
     return y;
}

int main(void)
{
     double x0,x1,eps,m,n,a;
     

    printf("please input x0=\n");
     scanf("%lf",&x0);
     
    printf("please input eps=\n");
     scanf("%lf",&eps);

    printf("please input m=\n");
     scanf("%lf",&m);

    n=0;
     do
     {
         x1=f(x0);
         if(fabs(x1-x0)>m)
         {
             printf("迭代失败,程序终止\n");
             return 0;
         }
         a=x0;
         x0=x1;
         n++;
     }
     while((x0-a)>eps);
     printf("x0=%lf,n=%lf",x0,n);  
     return 0;
     
}
2012-10-25 15:30
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:1 
学习版主,好榜样,忠于革命忠于党。
 虽然我是新手加菜鸟,但以往的学习经验告诉我找到自己的错误原因比不停的重复已经会的知识更让进步。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-10-25 17:24
张朝成
Rank: 4
等 级:业余侠客
帖 子:149
专家分:265
注 册:2012-3-22
得分:1 
你运行程序,根据它提示的错误一个一个找就好了!
2012-10-25 18:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:1 
就这么两行代码还整出个跟踪调试来,尽说些虚头巴脑的废话,你会么?看不懂就说看不懂,装什么装?

不用怀疑,我在说TonyDeng。也就你们这些新手能被他的废话唬住。跟我说说看完他的话你们都学到了什么?

他C语言用了多长时间我不知道,但连个strcat都用的那么烂(有兴趣可以搜他的代码,如果他没删的话),学多长时间还不是在原地打转。

大概一年前才开始学了点C++。半年前似乎又开始学C#。但都不过Hello World水平而已。

功夫全在嘴上,从不敢发代码。曾经发过两段挺唬人的代码(DOS时代的图形化界面),但今儿我就把话撂这儿——那绝不是他写的。

我也懒得争,有种就把那段代码重新贴出来回答我几个问题。

TonyDeng最让我受不了的品质就是诋毁一切他不懂的知识,当然事实上他什么也不懂。就这点水平我都纳闷是怎么在公司里混的?大概就是因为混的不行才跑这里装X找找感觉。


回到正题,贴子跟了3页却没一个真正找到问题所在的。楼上的朋友们,别老讲大道理了,踏踏实实的学习吧。

楼主的迭代函数是振荡收敛的,收敛速度很快,像是应用在自控中的一个高阶系统的传递函数(说错见谅)。 eps应该是控制收敛精度的吧?

主要问题出在这里,因为收敛是振荡的,所以将 while((x0-a)>eps); 改成 while(fabs(x0 - a) > eps);

上面防发散的判断中还有fabs,这里怎么就忘了?

重剑无锋,大巧不工
2012-10-25 20:44
cyhdahua
Rank: 7Rank: 7Rank: 7
来 自:山东
等 级:黑侠
威 望:2
帖 子:221
专家分:643
注 册:2012-6-15
得分:1 
重剑无锋,大巧不工
今个怎么这么锋利

WE GO
2012-10-25 21:00
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
嗨,我看不惯他又不是一两天了,你刚来论坛不知道而已。

其实我也纳闷,这种装X货多的是,我见过的也不只他一个,为什么我就是最看不惯他呢?

看来我的心胸还是不够宽广,得炼炼性子了。呵呵,让你见笑了。

大巧不工,是我对算法、代码追求的境界。本人性格非常锋利。

[ 本帖最后由 beyondyf 于 2012-10-25 21:08 编辑 ]

重剑无锋,大巧不工
2012-10-25 21:06
cyhdahua
Rank: 7Rank: 7Rank: 7
来 自:山东
等 级:黑侠
威 望:2
帖 子:221
专家分:643
注 册:2012-6-15
得分:0 
我经常看你写的代码,却是很符合你这句话
重剑无锋,大巧不工

只是看到你这个发言,突然不适应了
莫怪

WE GO
2012-10-25 21:18
小白学C
Rank: 1
等 级:新手上路
帖 子:5
专家分:1
注 册:2012-10-24
得分:1 
回复 6楼 TonyDeng
版主虽然我现在才初学函数但是你所说的流程我还是清楚的,看程序线执行哪步在执行哪步,把自己当计算机一样运算流程
2012-10-25 21:22
the_27th
Rank: 2
等 级:论坛游民
帖 子:29
专家分:29
注 册:2012-7-10
得分:1 
程序代码:
#include<stdio.h>
#include<math.h>
int main(void)
{
     double f(double x);//子函数没声明,然后形参也忘了写上去
     double x0,x1,eps,m,n,a;
     

    printf("please input x0=\n");
     scanf("%lf",&x0);
    
    printf("please input eps=\n");
     scanf("%lf",&eps);

    printf("please input m=\n");
     scanf("%lf",&m);

    n=0;
     do
     {
         x1=f(x0);
         if(fabs(x1-x0)>m)
         {
             printf("迭代失败,程序终止\n");
             return 0;
         }
         a=x0;//少了引号
         x0=x1;
         n++;
     }
     while((x0-a)>eps);
     printf("x0=%lf,n=%lf",x0,n); 
     return 0;
    
}
double f(double x)
{          
     double y;
     y=0.5*log(4-x);
     return y;
}
2012-10-25 21:31
雨天不寂寞
Rank: 1
等 级:新手上路
帖 子:4
专家分:1
注 册:2012-10-26
得分:1 
我用你的代码执行了一次  直接运行错误,还得看看楼主  我也才开始学  努力  哈哈
2012-10-26 17:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-383912-1-1.html




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

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