How to run a function?

22 ビュー (過去 30 日間)
DIEGO FOSSO
DIEGO FOSSO 2015 年 6 月 28 日
コメント済み: Geoff Hayes 2015 年 6 月 29 日
Hi , its the first time I'm using Matlab, I would like to know how can i run this function
function [ x,fx ,iter,x_vett]=gradiente(f,grad,x0,maxiter)
considering that f is a function of more variables, grad is a number (gradient of f), x0 is a vector and maxiter the maximum number if iterations. I use the command
[ x,fx ,iter,x_vett]=gradiente(f,grad,x0,maxiter)
with the f=@(x) 3*x(1)+2x(2) but it displays an error : "too many input arguments"
  4 件のコメント
DIEGO FOSSO
DIEGO FOSSO 2015 年 6 月 28 日
This is the code of the function:
function [ x,fx ,iter,x_vett]=gradiente(f,grad,x0,toll,maxiter)
x=x0;
fx=feval(f,x(1),x(2));
d=-feval(grad,x(1),x(2));
err=norm(d);
iter=0;
x_vett=[x];
while (err>toll) & (iter <=maxiter)
alpha=linesearch(f,grad,x,d);
x=x+alpha*d;
x_vett=[x_vett,x];
d=-feval(grad,x(1),x(2));
err=norm(d);
iter=iter+1;
end
fx=feval(f,x(1),x(2));
if (err>toll) & iter>maxiter
error('Hai superato il numero max di iterazioni!!!')
end
This are my inputs and the errors
>> f=@(x) [2*x(1)+3*x(2)];
>> x0=[1,2];
>> grad=3;
>> maxiter=10;
>> toll=0.5;
>> [ x,fx ,iter,x_vett]=gradiente(f,grad,x0,maxiter)
Error using @(x)[2*x(1)+3*x(2)]
Too many input arguments.
Error in gradiente (line 8)
fx=feval(f,x(1),x(2));
DIEGO FOSSO
DIEGO FOSSO 2015 年 6 月 28 日
This is the funtion "linesearch" (if you want to try to run it)
function alpha=linesearch(f,grad,x,d)
gamma=0.1;
sigma=1/4;
alpha=1;
alphamin= 10^(-3);
xnew=x+alpha*d;
while feval(f,xnew(1),xnew(2))>feval(f,x(1),x(2))+... % I cond. di Wolfe
gamma*alpha*feval(grad,x(1),x(2))'*d & alpha>alphamin
alpha=sigma*alpha;
xnew=x+alpha*d;
end

サインインしてコメントする。

採用された回答

Thorsten
Thorsten 2015 年 6 月 28 日
編集済み: Thorsten 2015 年 6 月 29 日
You have defined your function f with a single argument x but you call it with two arguments x(1) and x(2) in using fx=feval(f,x(1),x(2)); instead, use
fx=feval(f,x);
  2 件のコメント
DIEGO FOSSO
DIEGO FOSSO 2015 年 6 月 29 日
How can I define a function of two variables? I can't change fx = feval (f, x(1), x(2)) because it's not a code written by me
Geoff Hayes
Geoff Hayes 2015 年 6 月 29 日
Try
f=@(x,y) [2*x+3*y];

サインインしてコメントする。

その他の回答 (1 件)

Geoff Hayes
Geoff Hayes 2015 年 6 月 28 日
Diego - when I run the above code, I observe the same error. This is because your anonymous function f is defined as a function that accepts a single input parameter
f=@(x) [2*x(1)+3*x(2)];
In gradiente, the following call is made against this function using feval
fx=feval(f,x(1),x(2));
and so we are passing two input parameters to a function that is expecting one (and so the error makes sense).
It is probably easier to just modify the function f to accept to input parameters as
f=@(x,y) [2*x+3*y];
and you should be able to proceed from there.
I did notice that the code in gradiente is assuming that the input grad is a function too
d=-feval(grad,x(1),x(2));
yet you are passing in the constant three. This will lead to the following error here (and in linesearch)
Error using feval
Argument must contain a string or function_handle.
Error in gradiente (line xxx)
d=-feval(grad,x(1),x(2));
How should grad be written as a function?

カテゴリ

Help Center および File ExchangeData Distribution Plots についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by