让我们说,我有一个函数'x'和一个函数'2sin(x)'
如何输出交集,即MATLAB中的根?我可以很容易地绘制这两个函数并以这种方式找到它们,但肯定必须存在这样做的绝对方法。
答案 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
可能足够快。