2013-09-23 6 views
3

나는 함수 f (t)를 가지며 0 ~ 6 * pi 범위에서 y = -1 및 y = 1과 교차하는 모든 점을 얻고 싶습니다. 내가 감기에 걸리는 유일한 방법은 그것들을 계획하고 f (t)가 y = 1 그래프를 만나는 x 축 pt를 찾으려고하는 것입니다. 그러나 이것은 나에게 정확한 지점을주지 않는다. 그 대신 가치있는 것을 나에게 줄 수 있습니다. This is how I am getting the points.두 그래프에 대한 Matlab 솔루션

clear; 
clc; 
[email protected](t) (9*(sin(t))/t) + cos(t); 
fplot(f,[0 6*pi]); 
hold on; plot(0:0.01:6*pi,1,'r-'); 
     plot(0:0.01:6*pi,-1,'r-'); 
     x=0:0.2:6*pi; h=cos(x); plot(x,h,':') 

답변

2

적어도 일반적으로 두 방정식의 시스템을 해결하려고합니다. 방정식 중 하나가 상수이고 따라서 y = 1 인 간단한 경우에 대해 fzero를 사용하여 해결할 수 있습니다. 물론 좋은 출발점을 찾기 위해 그래픽 방식을 사용하는 것이 항상 좋은 생각입니다. 두 곡선이 교차하는 위치를 찾으려면

[email protected](t) (9*(sin(t))./t) + cos(t); 
y0 = 1; 

아이디어는, 다음을 빼기 결과 차이의 근본을 찾는 것입니다.

이 (그건 그렇고, MATLAB은 F 벡터 나 배열 입력에 문제가되지 않도록 내가 분할에 대한 ./ 사용 있습니다.이 개발하는 좋은 습관이다.)

참고 f (t)는 MATLAB에서 0으로 엄격하게 정의되어 있지 않으므로 0/0이됩니다. (A 제한은 함수에 대한 물론 존재하며, 내 limest 도구를 사용하여 평가 될 수있다.)

limest(f,0) 
ans = 
      10 

을 내가 솔루션이 0에 있지 알고 있기 때문에, 난 그냥 거기 찾고에서 fzero 경계를 사용합니다 뿌리.

format long g 
fzero(@(t) f(t) - y0,[eps,6*pi]) 
ans = 
      2.58268206208857 

하지만이 유일한 루트입니까? 두 가지 이상의 솔루션이 있다면 어떨까요? 완전히 뿌리를 둔 함수의 모든 뿌리를 찾는 것은 뿌리가 무한히 가까워 지거나 무한히 많은 뿌리가있을 수 있으므로 심한 문제가 될 수 있습니다.

하나의 아이디어는 문제에 대한 여러 솔루션을 찾는 방법을 알고있는 도구를 사용하는 것입니다. 다시 파일 교환에서 발견되었으므로 research을 사용할 수 있습니다.

y0 = 1; 
rmsearch(@(t) f(t) - y0,'fzero',1,eps,6*pi) 
ans = 
      2.58268206208857 
      6.28318530717959 
      7.97464518075547 
      12.5663706143592 
      13.7270312712311 

y0 = -1; 
rmsearch(@(t) f(t) - y0,'fzero',1,eps,6*pi) 
ans = 
      3.14159265358979 
      5.23030501095915 
      9.42477796076938 
      10.8130654321854 
      15.707963267949 
      16.6967239156574 
+0

해결책을 설명하는 데 시간을내어 주셔서 감사합니다. – camelbrush

0

이 시도 :

y = fplot(f,[0 6*pi]); 

지금 당신은 당신이 찾고있는 값 y을 분석 할 수 있습니다.

[x,y] = fplot(f,[0 6*pi]); 
[~,i] = min(abs(y-1)); 
point = x(i); 

이것은 가장 가까운 교차점 중 하나를 찾습니다. 당신이 여기 for

+0

감사합니다. 하지만 내가 원하는 것은 내 f (t)가 y = 1 라인과 교차 할 때의 대응 포인트입니다. – camelbrush

+0

내가 얻는 포인트는 1.0179입니다. 이것은 분명히 내 함수가 y = 1 라인과 교차하는 곳이 아닙니다. – camelbrush

+0

y = 1 라인 앞뒤에 포인트를 찾은 다음'interp1'을 사용하여'y = 1'에 해당하는 값을 찾으십시오. – am304

0

와 벡터 겪고 Otherwhise 내가 자주 사용 for와 변종 :이의 MEX-파일을 만들 경우

clear; 
clc; 
[email protected](t) (9*(sin(t))/t) + cos(t); 
fplot(f,[0 6*pi]); 
[fx,fy] = fplot(f,[0 6*pi]); 
hold on; plot(0:0.01:6*pi,1,'r-'); 
     plot(0:0.01:6*pi,-1,'r-'); 
     x=0:0.2:6*pi; h=cos(x); plot(x,h,':') 

k = 1; % rising 
kt = 1; % rising 
pn = 0; % number of crossings 
fy = abs(fy-1); 
for n = 2:length(fx) 
    if fy(n-1)>fy(n) 
     k = 0; % falling 
    else 
     k = 1; % rising 
    end 

    if k==1 && kt ==0 % change from falling to rising 
     pn = pn +1; 
     p(pn) = fx(n); 
    end 
    kt = k; 
end 

당신은 빨리이를 할 수는 ...

+0

고맙습니다. +1 좋은 대안 아이디어. – camelbrush