显示 更早的评论
Hi, I have the following code but when i run it gives an error . The code :
function lambda = drive_zr17t9001
format short e;
Params = load('saved_data.mat');
theta = pi/2;
zeta = cos(theta);
I = eye(Params.n,Params.n);
Q = zeta*I-Params.p*Params.p';
%T is a matrix(5,5)
Mroot = Params.M.^(1/2); %optimization
T = Mroot*Q*Mroot;
%find the eigen values
E =real( eig(T));
%find the negative eigen values -- %find the smallest negative eigen value
gamma = min(E);
%now solve for lambda
bounds = sort([0, -1/gamma]); %in case gamma is positive
M_inv = inv(Params.M); %optimization
lambda = fzero(@(lambda) zr17t9001(lambda,M_inv,Q,Params.zm),bounds); %do the searching
% end
function r = zr17t9001(lambda, M_inv, Q, zm)
Winv = inv(M_inv+lambda.*Q);
r = -(Params.zm)'*M_inv*Winv*Q*Winv*M_inv*(Params.zm);
%end
The error
??? Error using ==> fzero
FZERO cannot continue because user supplied function_handle ==> @(lambda) zr17t9001(lambda, M_inv, Q, Params.zm)
failed with the error below.
Undefined variable "Params" or class "Params.zm".
Error in ==> drive_zr17t9001 at 19
lambda = fzero(@(lambda) zr17t9001(lambda, M_inv, Q, Params.zm), bounds); %do the searching
采纳的回答
更多回答(1 个)
Matt Tearle
2011-11-29
0 个投票
Change the instances of Params.zm in your subfunction zr17t9001 to just zm. (Leave them as they are in the main function drive_...)
Here's why: in the subfunction, you define zm as an input. You are not passing the whole Params structure in, just one particular value that, locally, is called zm.
Note: I copied exactly what you pasted, made the change I suggested (change r = -(Params.zm)'*M_inv*Winv*Q*Winv*M_inv*(Params.zm); to r = -(zm)'*M_inv*Winv*Q*Winv*M_inv*(zm);) and it worked fine for me. Obviously I had to create a saved_data.mat with some fake data in it.
8 个评论
zayed
2011-11-29
Matt Tearle
2011-11-29
Any particular error?
And, just to be clear, you took exactly the code you initially posted, and changed the two instances of Params.zm on the second-to-last line (r = - ...) to zm, right? And no other changes?
zayed
2011-11-29
Matt Tearle
2011-11-30
OK, good. So the posted problem (Undefined variable "Params" or class "Params.zm") is solved. This is an entirely different problem relating to the details of your function. That's something for you to figure out. I'd suggest evaluating and plotting zr17t9001 as a function of lambda (in the range given by "bounds") to see what's going on, before trying to apply fzero (or, for that matter, any other root-finding algorithm).
zayed
2011-11-30
Walter Roberson
2011-11-30
Put a breakpoint in at the call to fzero (but before executing it.) Then at the command window, command
t = linspace(0, -1/gamma, 50);
z = zeros(size(t));
for K = 1 : length(t); z(K) = Lz(t(K)); end
plot(t,z);
zayed
2011-11-30
Matt Tearle
2011-12-1
What gives this error? Where is this error coming from? As a variation on Walter's suggestion, put these three lines *before* the call to fzero (and, ideally, comment out the fzero line).
l = linspace(0,-1/gamma);
z = arrayfun(Lz,l);
plot(l,z)
Do you get a plot? If so, does it look like something you were hoping for? In particular, does it have any zeros? You could also dive in and look at the values you're getting for z to see if your function is doing what you expect it to do.
类别
在 帮助中心 和 File Exchange 中查找有关 Debugging and Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!