如何在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中找到两个函数的交集?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到两个数组列的交集

如何找到两个 Django 查询集的交集?

如何找到列表交集?

在Python / Numpy / Scipy中找到两个数组之间的插值交集

如何计算 php 中未知数量数组的交集?

matlab如何让坐标轴的值减少一百倍