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

时间:2015-08-16 13:55:25

标签: matlab intersection

让我们说,我有一个函数'x'和一个函数'2sin(x)'

如何输出交集,即MATLAB中的根?我可以很容易地绘制这两个函数并以这种方式找到它们,但肯定必须存在这样做的绝对方法。

2 个答案:

答案 0 :(得分: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 :(得分:3)

在撰写评论时,我认为

syms x; solve(x==2*sin(x))

会返回预期的结果。至少在Matlab 2013中,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可能足够快。