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이다 이 문제가 발생합니다.