标题:[程序纠错]截弦法解一元三次多项式,为什么输入之后按回车会不出结果!
只看楼主
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
得分:0 
回复 8楼 TonyDeng
我是按照参考答案输入的亮点x1=2,x2=6,所以这两点之间肯定有一个根

既然还有不甘心
就还没到放弃的时候~
2015-04-01 22:19
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
得分:0 
回复 9楼 embed_xuel
我喜欢这样写~O(∩_∩)O~

既然还有不甘心
就还没到放弃的时候~
2015-04-01 22:19
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
得分:0 
  参考空间x1=2,x2=6

既然还有不甘心
就还没到放弃的时候~
2015-04-01 22:23
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:10 
我不懂你说的截弦法是啥,但是我觉得这句话是有问题的
while(abs(f(x)<=1e-6))    可能一直在循环里出不来。因为abs(f(x)<=1e-6)这里,你是对f(x)<=1e-6的值做abs,我想你是不是想表达这个意思:while(abs(f(x))<=1e-6),注意我括号的位置

总有那身价贱的人给作业贴回复完整的代码
2015-04-01 22:31
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
得分:0 
回复 30楼 S140131022
加好友 QQ260081379
→_→

授人以鱼,不如授人以渔
2015-04-01 22:37
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
回复 30楼 S140131022
while(abs(f(x)<=1e-6))
    {
    if(f(x)*f(x1)>0)
    x1=x;
    else
    x2=x;
    x=xpoint(x1,x2);
    }
    return x;
while(abs(f(x)<=1e-6))是我对这句理解有误,但是既然abs(f(x)<=1e-6)已经确定了方程的根,为什么不直接返回x呢。
2015-04-01 22:56
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:5 
float root(float x1,float x2,float y1,float y2)
{
    float f(float x);
    float x,y;
   x=(x1*y2-x2*y1)/(y2-y1);
   y=f(x);   
    if(y>0?y<1e-6:-y<1e-6) return x;
    if(y*y1>0) return root( x, x2, y, y2);
     return root( x1, x, y1, y);
  }

按着我的理解写了一个递归函数,没有测试,楼主可以试一下.
2015-04-01 23:30
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
float root(float,float,float,float);
float f(float);
float y1,y2,x1,x2;
while(1)
{
   scanf("%f %f",&x1,&x2);
   y1=f(x1);
   y2=f(x2);
   if(y1*y2<0)
   {
      printf("The root is   %.2f",root(x1,x2,y1,y2));
      return 0;
   }
   printf("Please change the nums please!\n");
}

}

float f(float x)
{
return x*x*x-5*x*x+16*x-80;
}

float root(float x1,float x2,float y1,float y2)
{
   float f(float x);
   float x,y;
   x=(x1*y2-x2*y1)/(y2-y1);
   y=f(x);
   printf("The ro  %f   %f",x,y);   
   if(y>0?y<1e-6:-y<1e-6) return x;
   if(y*y1>0) return root( x, x2, y, y2);
   return root( x1, x, y1, y);
 }
初始值选不好,能造成死循环,如何避免很麻烦,弦截法中应该有解决的办法吧。
2015-04-02 00:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
3次方程可能有3个不相等的实数根,书上给出的算法和实现方案是不现实的。用特定的某个方程来验证算法,不能说明问题。

授人以渔,不授人以鱼。
2015-04-02 14:26
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
得分:0 
回复 34楼 embed_xuel
对了哟~ 就是这个错误!

既然还有不甘心
就还没到放弃的时候~
2015-04-02 18:57



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




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

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