假设我有一个函数'x'和一个函数'2sin(x)'。
如何在MATLAB中输出它们的交点,即根?我可以轻松地绘制这两个函数并以此找到它们,但肯定存在一种绝对的方法来做到这一点。
假设我有一个函数'x'和一个函数'2sin(x)'。
如何在MATLAB中输出它们的交点,即根?我可以轻松地绘制这两个函数并以此找到它们,但肯定存在一种绝对的方法来做到这一点。
如果你有两个分析函数(我指的是符号函数),你可以定义它们的差,并使用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
已经被赋值。
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
可能已经足够快速。
doc solve
。确实有很好的例子。但是请注意,(至少按照默认行为)它不会为三角函数提供无限级数的根,例如syms x; solve(x==tan(x))
只会给出原点上的根,而solve(1==2*sin(x))
只会给出两个根。 - Andras Deak -- Слава Україні