Matlab에서 방정식의 모든 근을 찾는 방법은 무엇입니까?

Matlab에서 방정식의 모든 근을 찾는 방법은 무엇입니까? 나는 시도했고 그것은 나에게 뿌리 중 하나를 주었다.

예 : 내 방정식은 $ F (x) = 0 $입니다. 여기서

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

댓글

  • 등식을 확인하십시오. ' 유효한 Matlab 구문 (고독한 점)이라고 생각하지 않습니다.
  • 무엇입니까 MATLAB에서 시도 했습니까?

답변

모두 찾기 전에 이 함수의 근본을 MATLAB에서 무제한으로 많이 가지고 있다는 것을 이해할 가치가 있다고 생각합니다. $ \ 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 함수를 사용하는 것입니다. 모든 0을 찾을 수 있다고 보장되지는 않지만 fzero에 간격을 전달하면 적어도 함수 변경이 해당 간격에 서명하는 0을 찾을 수 있습니다. 충분히 작은 간격을 선택하면 매우 좋은 결과를 얻을 수 있습니다.

예를 들어 다음 코드는 간격 [-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과 같기 때문입니다.

Answer

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_) 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다