查看: 449|回复: 6|关注: 0

[已解决] 怎样用匿名函数算区间内是否存在零点

[复制链接]

新手

7 麦片

财富积分


050


3

主题

9

帖子

0

最佳答案
我是Matlab新手qwq学校教得也很不细...
要求是写一个匿名函数 haszero = @(g,a,b)...; 当g在[a,b]上有零点,函数输出1,没有零点输出0
我想的是用logic来做:
haszero = @(g, a, b) fsolve(g, 0, [a,b])>=a && fsolve(g, 0, [a,b])<=b;

但是实验的时候不管有没有零点输出始终是1,试了好久算不出哎...
版本是R2018a, Mac的OS系统
谢谢各位前辈了!!求求各位救救孩子,实在写不出了...

论坛优秀回答者

权威

9115 麦片

财富积分



11

主题

1万

帖子

1992

最佳答案
  • 关注者: 495
发表于 2019-2-5 19:07:07 | 显示全部楼层
本帖最后由 jingzhaos 于 2019-2-5 19:13 编辑

感觉你可以这样:
[x,fval,exitflag,output] = fminbnd(fun, a,b)
看fval是否<0
再看 [x,fval,exitflag,output] = fminbnd(-fun, a,b),求得-fval为最大值
-fval是否大于0,
最大值如果大于0,最小值如果小于0,肯定过0点。
最大值,最小值同号,不过0点。比如
  1. func=@(x) sin(x)
  2. [x1,fval1]=fminbnd(func,2,4)
  3. [x2,fval2]=fminbnd(@(x)-func(x),2,4)
  4. if sign(fval1)~=sign(-fval2)
  5.     disp("过0点")
  6.     logic=1
  7. end
复制代码

新手

7 麦片

财富积分


050


3

主题

9

帖子

0

最佳答案
 楼主| 发表于 2019-2-5 19:43:42 | 显示全部楼层
jingzhaos 发表于 2019-2-5 19:07
感觉你可以这样:
[x,fval,exitflag,output] = fminbnd(fun, a,b)
看fval是否

但是这样不能直接输入func(f,a,b)判断吧...不符合题目要求啊

论坛优秀回答者

权威

9115 麦片

财富积分



11

主题

1万

帖子

1992

最佳答案
  • 关注者: 495
发表于 2019-2-5 20:46:04 | 显示全部楼层 |此回复为最佳答案
本帖最后由 jingzhaos 于 2019-2-5 20:56 编辑
黑茶茶茶茶 发表于 2019-2-5 19:43
但是这样不能直接输入func(f,a,b)判断吧...不符合题目要求啊

匿名函数?那才能写多少代码,而且你的g还要是个函数句柄。你想这样?
  1. haszero=@(g,a,b) fsolve(g,(a+b)/2)>a & fsolve(g,(a+b)/2)<b;
  2. haszero('sin',2,4)
复制代码

新手

7 麦片

财富积分


050


3

主题

9

帖子

0

最佳答案
 楼主| 发表于 2019-2-5 23:54:57 | 显示全部楼层
jingzhaos 发表于 2019-2-5 20:46
匿名函数?那才能写多少代码,而且你的g还要是个函数句柄。你想这样?

...

试了一下发现可行!感谢前辈!
有一点我不太明白:我以为fsolve(g,(a+b)/2)求的是g=(a+b)/2时候的值,求零点为什么不是fsolve(g,0)呢?是我对fsolve理解有误吗?

再次感谢您的帮助!

论坛优秀回答者

权威

9115 麦片

财富积分



11

主题

1万

帖子

1992

最佳答案
  • 关注者: 495
发表于 2019-2-6 10:44:47 | 显示全部楼层
黑茶茶茶茶 发表于 2019-2-5 23:54
试了一下发现可行!感谢前辈!
有一点我不太明白:我以为fsolve(g,(a+b)/2)求的是g=(a+b)/2时候的值,求 ...

(a+b)/2是求x=(a+b)/2附近的0点,你要求[a,b]之间,这个0点对应的x应该是[a,b],所以用(a+b)/2作为迭代初值。fsolve(fun,x0),这个x0是初值。

新手

7 麦片

财富积分


050


3

主题

9

帖子

0

最佳答案
 楼主| 发表于 2019-2-7 00:09:11 | 显示全部楼层
jingzhaos 发表于 2019-2-6 10:44
(a+b)/2是求x=(a+b)/2附近的0点,你要求[a,b]之间,这个0点对应的x应该是[a,b],所以用(a+b)/2作为迭代初 ...

我懂了!谢谢您!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表