楼主: glhydxz123
10000 10

[问答] 二分法求解方程的根遇到的问题 [推广有奖]

  • 0关注
  • 1粉丝

已卖:181份资源

博士生

21%

还不是VIP/贵宾

-

威望
0
论坛币
299 个
通用积分
1.8418
学术水平
7 点
热心指数
8 点
信用等级
5 点
经验
34524 点
帖子
111
精华
0
在线时间
404 小时
注册时间
2012-9-29
最后登录
2021-11-4

楼主
glhydxz123 发表于 2013-1-21 13:01:02 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
程序如下:
fd<-function(x){
1/x/(1 + x) - log(x)/(1 + x)^2}
fzero<-function(f,a,b,eps=1e-5){
if(f(a)*f(b)>0)
   list(fail="failed")
else{
   repeat{
     if(abs(b-a)<eps) break
     x<-(a+b)/2
     if(f(a)*f(b)<0) b<-x else a<-x
   }
list(root=(a+b)/2,fun=f(x))
}
}
fzero(fd,0,10)
得到的结果是2.5与标准的3.59112相去甚远,望解答

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:二分法 解方程 二分法

沙发
clips 发表于 2013-1-21 13:54:09
fzero<-function(f,a,b,eps=1e-6){
  if(f(a)*f(b)>0)
    list(fail="failed")
  else{
    repeat{
      x<-(a+b)/2      
      if(f(a)*f(x)<0) b<-x else a<-x
      if(abs(b-a)<eps) break
    }
    list(root=(a+b)/2,fun=f(x))
  }
}
fd<-function(x)    1/x/(1 + x) - log(x)/(1 + x)^2
fzero(fd,0,10)
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
Aharach 发表于 2013-1-21 13:58:14
原因在于你给出的方程在区间[0,10]之间的解不唯一,而且2.5是方程的一个解
  1. > fzero(fd,3,10)
  2. $root
  3. [1] 3.4375

  4. $fun
  5. [1] 0.002852242

  6. > fzero(fd,3.5,10)
  7. $root
  8. [1] 3.550781

  9. $fun
  10. [1] 0.0006982531

  11. > fzero(fd,3.56,10)
  12. $root
  13. [1] 3.585156

  14. $fun
  15. [1] 0.0001011169

  16. > fzero(fd,3.59,10)
  17. $root
  18. [1] 3.590782

  19. $fun
  20. [1] 5.728486e-06
复制代码

板凳
glhydxz123 发表于 2013-1-21 14:13:25
clips 发表于 2013-1-21 13:54
fzero0)
    list(fail="failed")
  else{
感谢您的帮助。可以解释一下原来repeat里的那段程序哪里有问题吗?

报纸
glhydxz123 发表于 2013-1-21 14:16:32
Aharach 发表于 2013-1-21 13:58
原因在于你给出的方程在区间[0,10]之间的解不唯一,而且2.5是方程的一个解
感谢您的回复,不过fd是一个单调函数,出现在【0,10】上有两根是不现实的。作图也可以看到这一点

地板
clips 发表于 2013-1-21 14:36:17
Aharach 发表于 2013-1-21 13:58
原因在于你给出的方程在区间[0,10]之间的解不唯一,而且2.5是方程的一个解
这个解释不对。

7
Aharach 发表于 2013-1-21 15:51:27
呀,是我错了,没有注意函数性质。

Clips的程序是对的,源程序中,Repeat中的那个函数判断应该是用f(a) * f(x), 也就是中点值。
同时,赋值与判断的先后是有区别的,会出现漏根。
在你的原程序里面,迭代到第二次的时候,程序判断的是f(0)*f(2.5),此时不满足条件,因此a=b=2.5.
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

8
jmpamao 发表于 2013-1-21 20:51:21
请教各位 如果 方程有2个根,或以上时,怎么求解呢?
比如 x^2-1

9
clips 发表于 2013-1-21 21:06:53
先画图,再分段求。
已有 1 人评分热心指数 收起 理由
jmpamao + 1 xiexie

总评分: 热心指数 + 1   查看全部评分

10
ARCHER镜 发表于 2016-7-26 19:29:13
glhydxz123 发表于 2013-1-21 14:13
感谢您的帮助。可以解释一下原来repeat里的那段程序哪里有问题吗?
repeat循环需要用break语句跳出循环

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-20 15:34