Matlab如何求方程的所有根?

计算科学 matlab
2021-12-12 09:12:25

matlab如何求方程的所有根?我试过了,它只给了我一个根。

例如:我的方程是F(x)=0在哪里

 F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2)) 
2个回答

在尝试在 MATLAB 中找到该函数的所有根之前,我认为值得理解的是由于包含cos()学期。此外,在这种情况下,很容易通过分析找到函数的根:

根定义为

cos(7x)exp(2x2)(12x2)=0.
所以我们有
cos(7x)=0 or exp(2x2)=0 or (12x2)=0,
这使
x={(n+12)π7:nZ}{±1/2}.

为了从更一般的意义上回答您的问题,在 MATLAB 中查找多个根的一种简单方法是fzero在某个预定义范围内使用具有许多不同起始猜测的函数。这不能保证找到全零,但通过向您传递一个区间,fzero您至少可以保证您会找到函数在该区间上更改符号的零点。通过选择足够小的间隔,您可以获得非常好的结果。

例如,以下代码将在区间 [-10,10] 上查找函数的所有根。如果错过了任何根,您可以增加N以使用更多(更小)的起始间隔fzero请注意,这只会找到符号更改的根。

F = @(x) cos(7*x).*exp(-2*x.^2).*(1-2*x.^2);
interval = [-10, 10];
N = 500;
start_pts = linspace(interval(1),interval(2),N);
found_roots = [];
for i=1:numel(start_pts)-1
    try
        found_roots(end+1) = fzero(F,[start_pts(i),start_pts(i+1)]);
    end
end

% Plot results:
figure, hold on
fplot(F,interval,1e-4)
plot(found_roots,zeros(size(found_roots)),'rx')

*请注意,此方法(以及大多数数值方法)不适用于|x|大于 ~19.3 这个函数。这是因为exp(2(19.4)2)等于 0 与双精度数。

syms x
eq=cos(7*x)*exp(-2*x^2)*(1-2*x^2);
solve(eq==0,x)

答案=

      pi/14
  2^(1/2)/2
 -2^(1/2)/2

或者,如果您的 Matlab 版本是最新版本,您可以这样做

evalin(symengine,'solve(cos(7*x)*exp(-2*x^2)*(1-2*x^2)=0,x)') 

{-2^(1/2)/2, 2^(1/2)/2} union Dom::ImageSet(pi/14 + (pi*k)/7, k, Z_)