Function handle doesn't work as intended

Hi, I have a question regarding my matlab-code. Basically, the code should calculate the heat-transfer for drop-wise condensation. At the end of the program, I should have a funvtion with deltaT as variable parameter. But the error-message basically says that .* can't be used with function handles. I attached the file, so if anyone is willing to help me, you would make me very happy :) Any ideas how I could get the program fixed? Thanks in advance and best regards, Karsten

2 comentarios

James Tursa
James Tursa el 15 de Jun. de 2017
Please copy and paste the entire error message so we know which exact line is causing the problem and which exact error message MATLAB is giving you.
Karsten Gros
Karsten Gros el 15 de Jun. de 2017
Editada: James Tursa el 15 de Jun. de 2017
Hi, thanks for your quick response. Here's the error message:
Undefined operator '.*' for input arguments of type 'function_handle'.
Error in
qi_neu>@(deltaT)2./r_c.*((1+cos(Theta)./(2.*h_i)+delta./(lamda_coat.*sin(Theta).^2)+(r.*Theta)./(4.*lamda_l.*sin(Theta)))).^(-1).*r_c.^2.*pi.*(deltaT.*ln(r_c./r_min(deltaT))+2.*T_sat.*sigma./(H_fg.*rho_l).*(1./r_c-1./r_min(deltaT)))
Error in qi_neu (line 97)
q_tot1(1)

Iniciar sesión para comentar.

 Respuesta aceptada

Walter Roberson
Walter Roberson el 15 de Jun. de 2017
Q = @(r, deltaT) pi.*r.^2.*(deltaT-(2.*T_sat.*sigma)./(H_fg.*r.*rho_l)).*((1+cos(Theta)./(2.*h_i)+delta./(lamda_coat.*sin(Theta).^2)+(r.*Theta)./(4.*lamda_l.*sin(Theta)))).^(-1)
needs to be
Q = @(r, deltaT) pi.*r.^2.*(deltaT-(2.*T_sat.*sigma)./(H_fg.*r.*rho_l)).*((1+cos(Theta)./(2.*h_i(deltaT))+delta./(lamda_coat.*sin(Theta).^2)+(r.*Theta)./(4.*lamda_l.*sin(Theta)))).^(-1)

4 comentarios

Karsten Gros
Karsten Gros el 17 de Jun. de 2017
Hi, thanks for your response. I'll try that one out. Hopefully, it'll work :)
Karsten Gros
Karsten Gros el 17 de Jun. de 2017
So... I added the h_i(deltaT), but still the same Error-message. Any other ideas?
Walter Roberson
Walter Roberson el 17 de Jun. de 2017
When that change is made, that error message disappears, leaving you with other error messages.
  • You use delta_T twice in one of the lines, instead of deltaT
  • You use r once in a line where r has not been defined; it appears that should be r_c which is used multiple times on that line
  • You call upon ln() instead of log() . That is not an uncommon error -- and yet when I research I have been unable to find any major programming language that calls it ln()
Revised code attached. I have no idea if the correct value is calculated.
James Tursa
James Tursa el 19 de Jun. de 2017
Not a "major programming language", but MS Excel uses ln() for natural log.

Iniciar sesión para comentar.

Más respuestas (2)

James Tursa
James Tursa el 15 de Jun. de 2017
Just quickly looking though what was posted, this line:
grid onq_tot2 = @(deltaT) integral(@(r) stopp(r), r_c, r_max)
looks like it should be two separate lines:
grid on
q_tot2 = @(deltaT) integral(@(r) stopp(r), r_c, r_max)
Karsten Gros
Karsten Gros el 19 de Jun. de 2017
Editada: Karsten Gros el 19 de Jun. de 2017

0 votos

Hi, your corrections worked ;) Thank you very much. Could you give me a hint where you replaced the r with the r_c? And When I tried to plot the end-equation, It didn't work. Any hints for that one? (It works for q_tot1, but not for q_tot2 or q_tot) Best regards :)

8 comentarios

Your original line
q_tot1 = @(deltaT) 2./r_c.*((1+cos(Theta)./(2.*h_i)+delta./(lamda_coat.*sin(Theta).^2)+(r.*Theta)./(4.*lamda_l.*sin(Theta)))).^(-1).*r_c.^2.*pi.*(deltaT.*ln(r_c./r_min(deltaT))+2.*T_sat.*sigma./(H_fg.*rho_l).*(1./r_c-1./r_min(deltaT)))
has +(r.*Theta) as part of it, but r is not defined at that point. Changing that r to r_c allows the code to progress.
Karsten Gros
Karsten Gros el 20 de Jun. de 2017
Thanks :) Any idea, why the rest isn't working?
You have
q_tot2 = @(deltaT) integral(@(r) stopp(r), r_c, r_max)
you need
q_tot2 = @(DT) arrayfun(@(deltaT) integral(@(r) stopp(r,deltaT), r_c, r_max), DT);
This passes through the deltaT to stopp, which needs two parameters but you were only passing one. It also takes care of some issues with the fact that fplot calls the function with a vector but the code was only expecting to be called with a scalar.
When you have a true function (created with function) that uses a parameter and you do not pass something in that position, then MATLAB does not look throuh the calling environment to find a parameter with the name and use it: true functions are blind to their calling environment (except to what is provided by evalin('caller') or provided by inputname(), or dbstatus() or mfilename())
When you define an anonymous function and explicitly refer to a variable that is not named in the @() argument list, then at the time that the anonymous function is defined, MATLAB will look for a definition for that variable and will copy its current value into the function definition, "capturing" the value. If you refer to a variable that is not in the @() parameter list and is not defined at the time the anonymous function is defined, then MATLAB will give you an error at execution time, even if a variable of the same name is assigned to between the time the anonymous function is created and the time the anonymous function is called.
In your case you had something of the form
@(variable) somefunction(different_variable)
where somefunction was defined as an anonymous function @(somename, variable) . But at the time of calls, MATLAB does not look into the calling environment to search for a variable with a matching name, so even through somefunction wanted "variable" and there was a "variable" in the environment at the time of the call, MATLAB does not do that kind of looking by name. Looking by name is only for explicit references (and only at the time anonymous functions are defined.) So for example,
different_variable = 2343.3432914;
abc = @(variable) somefunction(different_variable, variable)
would be fine, because variable of the call would be matched against the parameter name from the definition, and the explicitly mentioned different_variable would be looked for in the environment and found and its 2343.3432914 value would be copied in to the function definition.
Karsten Gros
Karsten Gros el 28 de Jun. de 2017
Hi, thanks for your detailed answer. If I understand correctly, the variable of the new function q_tot2 is DT? Because I want to add q_tot1 and q_tot2, which only works if they have the same variabe, right?
Walter Roberson
Walter Roberson el 28 de Jun. de 2017
MATLAB passes values positionally. For example, @(Angle) sin(Angle) and @(theta) sin(theta) do the same thing. You do not need to match parameter names between different anonymous functions.
Karsten Gros
Karsten Gros el 28 de Jun. de 2017
Editada: Walter Roberson el 28 de Jun. de 2017
So that means this would work?
q_tot1 = @(deltaT) 2./r_c.*((1+cos(Theta)./(2.*h_i(deltaT))+delta./(lamda_coat.*sin(Theta).^2)+(r_c.*Theta)./(4.*lamda_l.*sin(Theta)))).^(-1).*r_c.^2.*pi.*(deltaT.*log(r_c./r_min(deltaT))+2.*T_sat.*sigma./(H_fg.*rho_l).*(1./r_c-1./r_min(deltaT)))
q_tot2 = @(DT) arrayfun(@(deltaT) integral(@(r) stopp(r,deltaT), r_c, r_max), DT)
q_tot = @(deltaT) q_tot1(deltaT)+q_tot2(dT)
No, you have not defined dT for that last line. Is there a reason you changed it from
q_tot = @(deltaT) q_tot1(deltaT)+q_tot2(deltaT);
Variable names do NOT need to match in the calling function and the called function! Variable names need to be consistent within any one function.
Karsten Gros
Karsten Gros el 28 de Jun. de 2017
It actually works, thank you very much :) I learnt a lot ;)

Iniciar sesión para comentar.

Categorías

Más información sobre Graphics Object Properties en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 15 de Jun. de 2017

Comentada:

el 28 de Jun. de 2017

Community Treasure Hunt

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

Start Hunting!

Translated by