Borrar filtros
Borrar filtros

What is Newton's method when there is a lot of input?

2 visualizaciones (últimos 30 días)
ryunosuke tazawa
ryunosuke tazawa el 3 de Mzo. de 2022
Respondida: Lokesh el 25 de Jul. de 2024
I am trying to estimate 3parameters of mixed weibull distribution. And I think the Nweton method for it.
But, error happend
'Error: exit :There are too many output arguments.
Error: etimation_weibull> accelerated_newton (line 30)
if ~ exit ('n_iter','var')
Error: etimation_weibull (line 21)
[x, x_err, x_h] = accelerated_newton (func, dfunc, x0, conv_tol, n_iter);
I think that the error is related to the part where the @ function is used. Is it not possible if there are multiple inputs?
Also, is there any other method for estimating the three parameters of the mixed Weibull distribution?
%% Estimation 3parameters in weibull distribution
load('weibul.mat')
Error using load
Unable to find file or directory 'traj.mat'.
X = Euclidean_distance; % input data
%% Define first-order and second-order derivatives of Weibull distribution
a = 0.1;
b = 0.1;
c = 0.1;
func = @(x,a,b,c) 1-exp((x-c)/a).^b;
dfunc = @(x,a,b,c) (x>c).*(b/a).*(((x-c)/a).^(b-1)).*exp(-(x-c)/a).^b;
x0 = Euclidean_distance(1);
conv_tol = 1e-10;
n_iter = 30;
[x, x_err, x_h] = accelerated_newton(func,dfunc,x0,conv_tol,n_iter); %● error happend
%% newton-methods function
function [x, x_err, x_h] = accelerated_newton(func,dfunc,x0,conv_tol,n_iter)
if ~isa(func, 'function_handle') || ~isa(dfunc,'function_handle')
error('function must be a handle (add"@" before the function name')
end
if ~exit('n_iter', 'var')
n_iter = 30;
end
if ~exist('conv_tol', 'var')
conv_tol = 1e-15;
end
x = x0;
x_h = nan(n_iter + 1, 1);
x_h(1) = x;
for k=1:n_iter
f = func(x);
df = dfunc(x);
delta = f./df;
if k==1
df_23 = dfunc(x - 2.*delta./3);
FF = 0.5 + sqrt(max(0 ,0.75.*df_23 - 0.5));
else
d2f = (4.*df + 2.*df_old - 6.*(f - f_old)./(x - x_old))./(x-x_old);
A2_hat = -.5.*d2f./df;
FF = 0.5 + sqrt(max(0, 0.25 - A2_hat.*delta));
end
x_old = x;
x = x_old - delta./FF;
x_h(k+1) = x;
x_err = abs(x_old - x);
if ((x_err < conv_tol) && (abs(f) - conv_tol))
x_h(k+2:n_iter+1) = [];
break;
end
df_old = df;
f_old = f;
if k == n_iter
disp('The function did not converge')
end
end
end

Respuestas (1)

Lokesh
Lokesh el 25 de Jul. de 2024
Hi,
There are a few errors in the code that lead to the errors "There are too many output arguments" and "Not enough input arguments."
The first error is due to the typo 'exit', which should be 'exist'. Here is the corrected code:
if ~exist('n_iter', 'var')
n_iter = 30;
end
Additionally, the functions func and dfunc are defined to expect four input variables (x, a, b, c), but they are being called with only a single input variable x, which leads to the error "Not enough input arguments."

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by