2014-09-23 3 views
0

Matlab에서 함수의 근원을 찾는 두 가지 방법을 사용하여 효율성을 테스트하려고합니다. 이를 수행하기 위해 각 메소드가 취하는 반복 횟수를 계산 한 다음 다양한 공차 값 (f (근사값)이 0에 가까운 값)에 대해 플롯합니다. 어떤 이유에서, 반복 값을 계산할 때 벡터에 저장하면 (다른 공차에 대한 다른 값이 있기 때문에) 벡터는 0으로 채워진 것처럼 보입니다. 내가 쓴 함수가 0을 반복 값으로 반환합니다. 여기에 내 모든 코드입니다 위의 코드에서Matlab의 벡터가 올바른 값을 채우지 못함

function cooldrive() 
    a = 0.1; b = 3; 
    tol = 0.01; 
    L = 1:0.1:4; 
    r_x = zeros(1, length(L)); 
    ctr = 1; 
    for i=L 
     [x, iter] = bis(a, b, tol, i); 
     r_x(ctr) = x; 
     ctr = ctr+1; 
     b = x; 
    end 

    r_x = r_x.^2; 
    figure 
    plot(L, r_x, '.-b', 'markersize', 16) 
    ylabel('Decay Rate, x^2'), xlabel('Length, L'), title('Cooling Rate') 
    grid 

    x = (a+b)/2; 
    r_iter_newt = zeros(1, 8); 
    r_iter_bis = zeros(1, 8); 
    r_tol = zeros(1, 8); 
    ctr = 1; 
    for j=1:8 
     tol = 10^(-1*j); 
     [x_newt, iter_newt] = newt(x, tol, 1); 
     [x_bis, iter_bis] = bis(a, b, tol, 1); 
     b = x_bis; 
     r_iter_newt(ctr) = iter_newt; 
     r_iter_bis(ctr) = iter_bis; 
     r_tol(ctr) = tol; 
     ctr = ctr+1; 
    end 

    figure 
    plot(r_tol, r_iter_newt, '.-r', 'markersize', 16) 
    hold on 
    plot(r_tol, r_iter_bis, '.-b', 'markersize', 16); 
    hold off 
return 

%% Bisection Method 
function [x, iter] = bis(a, b, tol, L) 
    iter = 0; 
    z1 = coolfun(a, L); 
    z2 = coolfun(b, L); 
    if z1 * z2 > 0 
     disp('Root may not exist') 
     x = NaN; 
     iter = NaN; 
     return 
    end 

    x = (a+b)/2; 

    while abs(coolfun(x, L)) > tol 
     if (coolfun(a,L)*coolfun(x,L)) <= 0 
      b = x; 
     else 
      a = x; 
     end 
     x = (a+b)/2; 
     iter = iter + 1; 
    end 
    %[x, iter] = bis(a, b, tol, L); 
return 

%% Newton's Method 
function [ox, iter] = newt(ix, tol, L) 
    iter = 0; 
    while abs(coolfun(ix, L)) > tol 
     x_j = ix - (coolfun(ix, L)/coolfundx(ix, L)); 
     ix = x_j; 
     iter = iter+1; 
    end 
    ox = ix; 
return 

%% Evaluate function 
function val = coolfun(x, L) 
    val = sin(x*L) + x*cos(x*L); 
return 

%% Evaluate Function's Derivative 
function val = coolfundx(x, L) 
    val = (L*cos(x*L)) - (L*x*sin(x*L)) + cos(x*L); 
return 

, iter_bis의 값은 항상 0, 그래서 r_iter_bis의 값이 나는 이유를 볼 수 없습니다 .... NaN가, 0, 0이다 이 문제가 발생합니다.

답변

1

문제는 루트가 존재하는지 테스트하는 것입니다. 당신은 당신이 해결하려고하는 기능이 단순하지 않기 때문에 그러나, 당신은 긍정적 인 모두 엔드 포인트를 가질 수

z1 = coolfun(a, L); 
z2 = coolfun(b, L); 
if z1 * z2 > 0 
    disp('Root may not exist') 

을 가지고 있지만 중간 점 부정적 (또는 그 반대). 이 경우에는 0이 여러 개 있지만 테스트에서는 테스트하지 않는다고 말하면 코드가 멈출 것입니다.

문제는 실제로 방법입니다. 이분법은 비 단조 함수에서는 작동하지 않습니다. 함수 값이 양수인지 음수인지에 따라 함수의 값이 0에 가까워 지도록 이동하는 방법이 무엇인지 알 필요가 있지만 함수가 단순하지 않은 경우에는 알 수 없습니다.

함수가 단조롭게되도록 이분 탐색 도메인을 제한하거나 다른 방법을 사용해야합니다.

관련 문제