【发布时间】:2015-08-16 13:55:25
【问题描述】:
比方说,我有一个函数“x”和一个函数“2sin(x)”
如何输出相交,即 MATLAB 中的根?我可以很容易地绘制这两个函数并以这种方式找到它们,但肯定必须存在一种绝对的方式来做到这一点。
【问题讨论】:
标签: matlab intersection
比方说,我有一个函数“x”和一个函数“2sin(x)”
如何输出相交,即 MATLAB 中的根?我可以很容易地绘制这两个函数并以这种方式找到它们,但肯定必须存在一种绝对的方式来做到这一点。
【问题讨论】:
标签: matlab intersection
如果您有两个分析(我的意思是符号)函数,您可以定义它们的区别并使用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 是一个之前已被赋值的变量。
【讨论】:
where is my tricky symbolic function zero 可能最好留给为符号问题设计的程序,如 Mathematica 或 Maple。 MATLAB 确实有一个名为mupad 的符号引擎,但我不信任它,也从未使用过它(当然这可能只是我的错误)。长话短说:如果有办法使用matlab获得全零,我不知道。特别是fzero 找到一个零,因为它使用了一种交集方法。
在写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 可能就足够了,而且速度更快。
【讨论】: