如何在MATLAB中找到两个函数的交点?

3

假设我有一个函数'x'和一个函数'2sin(x)'。

如何在MATLAB中输出它们的交点,即根?我可以轻松地绘制这两个函数并以此找到它们,但肯定存在一种绝对的方法来做到这一点。

2个回答

3

如果你有两个分析函数(我指的是符号函数),你可以定义它们的差,并使用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 已经被赋值。


1
为什么它只能找到一个解而不是所有的解?在MATLAB中有没有一个函数可以找到所有的根? - scadda
1
如果我没有弄错的话,MATLAB缩写为MATrix LABoratory。它被设计用于数值问题,并且在解决这些问题方面效果最好。询问“我的棘手符号函数的零点在哪里”可能最好留给专门设计用于符号问题的程序,如Mathematica或Maple。MATLAB确实有一个名为“mupad”的符号引擎,但我不信任它,从未使用过它(当然这可能只是我的错误)。长话短说:如果有一种方法可以使用matlab获取所有零点,我不知道。具体来说,“fzero”仅找到一个零点,因为它使用一种交叉方法。 - Andras Deak -- Слава Україні
符号工具箱在这种情况下是正确的选择。 工具箱可用吗? 基本上,解决函数的第一个示例包含您所需的一切。 - Daniel
@Daniel,就像我说的一样,我完全不熟悉matlab的那个方面。你能为此提供一个答案吗? - Andras Deak -- Слава Україні
我可以访问符号工具箱。 - scadda
@scadda,像@Daniel建议的那样看一下doc solve。确实有很好的例子。但是请注意,(至少按照默认行为)它不会为三角函数提供无限级数的根,例如syms x; solve(x==tan(x))只会给出原点上的根,而solve(1==2*sin(x))只会给出两个根。 - Andras Deak -- Слава Україні

3
在撰写评论时,我考虑到:
syms x; solve(x==2*sin(x))

这个问题在Matlab 2013b中,solve无法找到解析解,只能退而求其次使用数值求解器,只返回一个解 0

另一种选择是:

s = feval(symengine,'numeric::solve',2*sin(x)==x,x,'AllRealRoots')

这段文字摘自类似问题的这个答案。除了使用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可能已经足够快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接