2011-02-07 2 views

답변

2

이 교차의 숫자 값을 찾는 것이다 작성 솔루션과 라인 사이의 교차에서 제로 익명 함수를

을 당신이 추구 :

sol = dsolve('D3y-4*D2y+Dy+2*y=0,y(0)=-4,Dy(0)=-6,D2y(0)=-4'); 
my_func = @(x) subs(sol,'t',x) - x; % Your solution - x is equal to zero at the %intersections 

그래픽으로 값을 찾으려면

최적화 루틴에 의해

또는 수치 :

x = fzero(my_func,0); % I find x = -.6847 

당신이 값 곳 근처 fzero 기능을 시작해야합니다 있도록 모든 0을 찾을 수 없습니다 0 근처에 함수의 제로를 찾을 것이다 당신은 교차로를 기대합니다. 이 도움이

희망,

앤드류

편집하십시오 방법에 대한 이분법의.

최적화 방법을 사용하여 방정식을 풀고 싶지는 않지만 범위를 알고있는 경우 [range_ {min} range_ {max}] 익명의 1 차원 함수 "my_func"를 얻었 으면 my_func = 0 다음 알고리즘은 연속 함수로 작업 제공, 당신을위한 함수의 제로를 찾을 수 :

range_min = 0; % say our range is [0 2] 
range_max = 2; 

error_tolerance = .0001; % will find the answer to within .0001 

while (range_max - range_min < error_tolerance) 
range_temp = (range_max + range_min)/2; 
if ((my_func(range_temp) <0 & my_func(range_max)>0) | (my_func(range_temp) >0 & my_func(range_max)<0)) 
range_min = range_temp; 

else if ((my_func(range_min)<0 & my_func(range_temp)>0) | (my_func(range_min)>0 & my_func(range_temp)<0)) 
    range_max = range_temp; 

else if (my_func(range_temp == 0) 
range_min = range_temp; 
range_max = range_temp; 

    end 

end 

t_intersection = (range_min + range_max)/2; 

그래서 몇 가지 설명 : 함수는 연속, 그리고 당신은 경우 다음 인 경우 t_intersection에서 y = t와 교차하고 나서 수정 된 함수 my_func (t) = sol (t) -t에서 t_intersection에 0이 생깁니다. my_func가 연속적이기 때문에 함수의 두 값, 즉 0보다 크고 0보다 작은 값을 알고 있으면 함수의 제로를 찾을 수 있습니다.

이렇게 알려진 지점부터 시작하여 [range_min range_max] 범위를 정의합니다. 여기서 my_func (range_min) < 0과 my_func (range_max)> 0 또는 그 반대입니다. 그런 다음 중간 값 range_temp = mean (range_min 및 _max)을 만들어이 범위를 반으로 자릅니다. 범위에 대해 my_func의 부호 변경을 유지할 수 있도록 새 range [range_temp range_max] 또는 [range_min range_temp]를 작성합니다. 우리는 만족스러운 정확성에 도달 할 때까지이 과정을 반복합니다.

하나의주의해야 할 점은, 사용자가 제공 한 초기 범위 내에서 하나의 영점 만 찾을 수 있다는 것입니다. 이는 대부분의 제로 찾기 방법에 대한 근본적인 좌절이며,보다 일반적으로 제로 발견이 특별한 경우로 간주 될 수있는 최적화 분야입니다.

나는 행운, 즉 그것을 커버 생각합니다.

--Andrew

+0

음 ... 좋아 ... 어떻게 든 나는 그것을 얻지 않는다 ... 내 말은 - 나는 X가 얼마나 찾을 수 없습니다. 음. t = 0 : .3 : 10; y = sin (t); – Izumi

+0

좋아요 ... 음 ... 글쎄, 하나의 교차점을 찾았지만 간격 [0 2]에서 벗어 났고 분명히 x = 1 주위에있는 다른 교차점을 찾지 못했습니다. , y = 0이다. – Izumi

+0

@ lzumi, 의견 1 : y = t와 y = sin (t)의 교점을 찾으려면 z (t) = sin (t) - t의 0을 찾아야합니다. 다음과 같이하면 matlab에 익명 함수를 만들 수 있습니다. z = @ (t) sin (t) -t; 그런 다음 t_zero = fzero (z, 0)를 찾으십시오. – Sevenless