Matlabで方程式のすべての根を見つける方法は?試してみたところ、ルーツの1つだけが得られました。
例:私の方程式は$ F(x)= 0 $です。ここで、
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
コメント
- 方程式を確認してください-'これが有効なMatlab構文(孤立したドット)だとは思いません。
- 何 MATLABで試しましたか?
回答
すべてを検索する前に MATLABでのこの関数のルーツのem> は、のため、ルーツが無限に多いことを理解する価値があると思います。 $ \ cos()$項を含める。さらに、この場合、関数の根を分析的に見つけるのは簡単です。
根は$$ \ cos(7x)\ cdot \によって定義されます。 exp(-2x ^ 2)\ cdot(1-2x ^ 2)= 0。$$したがって、$$ \ cos(7x)= 0 \ text {または} \ exp(-2x ^ 2)= 0 \ textがあります。 {または}(1-2x ^ 2)= 0、$$は$$ x = \ left \ {\ left(n + \ frac {1} {2} \ right)\ dfrac {\ pi} {7}を与えます: n \ in \ mathbb {Z} \ right \} \ cup \ emptyset \ cup \ left \ {\ pm \ sqrt {1/2} \ right \}。$$
で質問に答えるにはより一般的な意味では、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)
ans =
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_)