debugging a matlab code

4 visualizaciones (últimos 30 días)
msh
msh el 27 de Jul. de 2014
Editada: msh el 28 de Jul. de 2014
Hi,
I am attaching the folder with the relevant files for running a particular matlab code. In the file, there are two codes:
  1. "leisure.m"
  2. "main.m"
I have all the functions necessary, to run those.
The problem is that while the program "leisure" runs perfectly, the "clone" of it which which is the second one, it gives different errors messages without amending anything in particular. So, I fed up trying to debug the second program and would like to know whether someone can help. The two most common errors that showed up, are:
Operands to the and && operators must be convertible to logical scalar values.
Error in fminbnd (line 321)
if ( (fu <= fw) || (w == xf) )
Error in main_optimum_quantity (line 96)
k1 = fminbnd(@vf2,kmin,kmax);
and
Subscript indices must either be real positive integers or logicals.
The programs and functions are really small so does not take lot of effort to read.
Many thanks
  7 comentarios
Patrik Ek
Patrik Ek el 28 de Jul. de 2014
Editada: Patrik Ek el 28 de Jul. de 2014
Regarding the first error: Try,
a = 1 && 0
b = [1,0] & [1,1]
c = isequal([1,0], [1,1])
d = [1,0] && [1,1];
I you are expecting scalar you must have a look in your code and find out where your code gives a wrong answer, otherwise if you only have used the wrong syntax it is easy to fix.
msh
msh el 28 de Jul. de 2014
I possibly figure out what is going on, but I cannot really understand the nature of the problem. The problem, is that when my function vf2 is evaluated at k=0, it returns an empty matrix. But once I do manually the steps for k=0, this does not occur. Can someone here understand more than me what is going on? I do not see any syntax errors or have missed something in my code.

Iniciar sesión para comentar.

Respuesta aceptada

Geoff Hayes
Geoff Hayes el 28 de Jul. de 2014
In fminbnd, fu is set as follows
fu = funfcn(x,varargin{:});
where funfcn is your function vf2. If, as suggested by per, you had used the dbstop if error, then you could re-evaluate this statement in the Command Window and observe that
K>> fu = funfcn(x,varargin{:})
fu =
Empty matrix: 1-by-0
So fu is indeed empty for these inputs (in fact, varargin is empty, so x is the only valid input (with x==5.0501e-04)). Now if you put a breakpoint at the first line of vf2, you can then re-evaluate funfcn(x,varargin{:}) and step through the code. The output from this function is val and it gets set as
if c<=0
val = -9999999-999*abs(c);
else
val=((c^eta*(1-l)^(1-eta))^(1-mu))/(1-mu) + beta*(gg*prob(j,:)');
end
For this evaluation of the function, the code enters the else body. Look at each variable, the majority of which have been declared as global variables. All except for j have a numeric value - j is an empty matrix!
The global statement from this function is
global v0 beta eta kmat k0 mu prob a0 rtax wtax grate j
As all, except j, have numeric data, it must be the case that j has not been defined as a global variable anywhere else in the code. If you open main.m, you will see that the global variables are
global v0 beta eta kmat k0 mu prob a0 rtax wtax grate
So all global variables from vf2 except j. Since you iterate over j in the Optimal Plans section of your code (within main.m) then I suspect that you mean to use this j (in vf2)and so it should be declared as a global variable within main.m.
  1 comentario
msh
msh el 28 de Jul. de 2014
Editada: msh el 28 de Jul. de 2014
I did, what per said, and I understood what what the problem, and indeed is what you wrote. But, i did not know how to fix it. My mistake was, that I thought Matlab keeps the j value in memory so by the time the function is evaluated I assumed the value of j is known by the iteration without assigning global character. But I guess that was a mistake. This now explains when I was doing the steps manually i did not had that problem. Thanks for the response to you and everyone for their time.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Function Creation en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by