如何在MATLAB中找到两个函数的交集?
Posted
技术标签:
【中文标题】如何在MATLAB中找到两个函数的交集?【英文标题】:How to find the intersections of two functions in MATLAB? 【发布时间】:2015-08-16 13:55:25 【问题描述】:比方说,我有一个函数“x”和一个函数“2sin(x)”
如何输出相交,即 MATLAB 中的根?我可以很容易地绘制这两个函数并以这种方式找到它们,但肯定必须存在一种绝对的方式来做到这一点。
【问题讨论】:
【参考方案1】:如果您有两个分析(我的意思是符号)函数,您可以定义它们的区别并使用fzero
找到一个零,即根:
f = @(x) x; %defines a function f(x)
g = @(x) 2*sin(x); %defines a function g(x)
%solve f==g
xroot = fzero(@(x)f(x)-g(x),0.5); %starts search from x==0.5
对于棘手的功能,您可能必须设置一个好的起点,即使有多个解决方案,它也只会找到一个解决方案。
上面看到的@(x) something-with-x
的构造被称为匿名函数,它们也可以扩展到多变量情况,例如@(x,y) 3*x.*y+c
假设c
是一个之前已被赋值的变量。
【讨论】:
为什么它只能找到一种解决方案而不是所有解决方案?是否有一个函数可以在 MATLAB 中找到所有根? 如果我没记错的话,MATLAB 是 MATrix LABoratory 的缩写。它专为数值问题而设计,最擅长解决这些问题。问问题where is my tricky symbolic function zero
可能最好留给为符号问题设计的程序,如 Mathematica 或 Maple。 MATLAB 确实有一个名为mupad
的符号引擎,但我不信任它,也从未使用过它(当然这可能只是我的错误)。长话短说:如果有办法使用matlab获得全零,我不知道。特别是fzero
找到一个零,因为它使用了一种交集方法。
符号工具箱在这种情况下是正确的选择。工具箱可用吗?基本上,求解函数的第一个示例包含您需要的所有内容。
@Daniel,正如我所说,我对 matlab 的这方面完全不熟悉。你能提供一个答案吗?
我确实可以使用符号工具箱。【参考方案2】:
在写cmets的时候,我是这么想的
syms x; solve(x==2*sin(x))
会返回预期的结果。至少在 Matlab 2013b 中,solve
无法找到该问题的解析解,退回到仅返回一个解的数值求解器,0
。
另一种选择是
s = feval(symengine,'numeric::solve',2*sin(x)==x,x,'AllRealRoots')
取自this answer 到一个类似的问题。除了使用AllRealRoots
,您还可以使用数字求解器,手动设置与您从图表中读取的值大致匹配的起点。这样你就可以得到精确的结果:
[fzero(@(x)f(x)-g(x),-2),fzero(@(x)f(x)-g(x),0),fzero(@(x)f(x)-g(x),2)]
要获得更高的精度,您可以从 fzero
切换到 vpasolve
,但 fzero
可能就足够了,而且速度更快。
【讨论】:
以上是关于如何在MATLAB中找到两个函数的交集?的主要内容,如果未能解决你的问题,请参考以下文章