Need some help with a while loop
1 回表示 (過去 30 日間)
古いコメントを表示
x0=[0.8 0.8 0.2 0.2]';
tol=1e-6;
m0=[0.5 0.5]';
syms x y z p m1 m2
h1=y-(x^3)-(z^2);
h2=(x^2)-y-p^2;
h=[h1 h2]';
f=-x;
L=f+m1*h1+m2*h2;
h0=subs(h, {x,y,z,p}, [x0(1,1) ,x0(2,1) ,x0(3,1) ,x0(4,1)]);
h0=double(h0);
g1=gradient(h1, [x,y,z,p]);
g2=gradient(h2, [x,y,z,p]);
J=[g1 g2]';
J0=subs(J, {x,y,z,p}, [x0(1,1) ,x0(2,1) ,x0(3,1), x0(4,1)]);
J0=double(J0);
n=size(J0,1);
m=size(J0,2);
DL=gradient(L, [x,y,z,p,m1,m2]);
DL=subs(DL, x, x0(1,1));
DL=subs(DL,y,x0(2,1));
DL=subs(DL,z,x0(3,1));
DL=subs(DL,p,x0(4,1));
DL=subs(DL,m1, m0(1,1));
DL=subs(DL,m2,m0(2,1));
DL=double(DL);
DLd=DL(1:n,1);
H=hessian(L,[x,y,z,p]);
H0=subs(H,x,x0(1,1));
H0=subs(H0,y,x0(2,1));
H0=subs(H0,z,x0(3,1));
H0=subs(H0,p,x0(4,1));
H0=subs(H0,m1,m0(1,1));
H0=subs(H0,m2,m0(2,1));
H0=double(H0);
[Q,R]=qr(J0);
Z=Q(1:n,m+1:n);
qz=Z'*DLd;
qh=h0;
while norm(qz)+norm(qh)>tol
E=[Z'*H0; J0'];
V=[Z'*DLd; h0];
s0=E\-V;
x0=x0+s0;
J0=subs(J,x,x0(1,1));
J0=subs(J0,y,x0(2,1));
J0=subs(J0,z,x0(3,1));
J0=subs(J0,p,x0(4,1));
J0=double(J0);
[Q, R]=qr(J0);
Y=Q(1:n,1:m);
Z=Q(1:n,m+1:n);
r=R(1:m, 1:m);
T0=[-1 0 0 0 ]';
m0=r\-(Y'*T0);
qz;
qh;
end
newvect=[double(x0); double(m0)]
MATLAB does't return any errors, however, the code seems to loop infinitely many times I guess. I have no clue why?
Is there anything wrong with the code??
2 件のコメント
madhan ravi
2018 年 12 月 30 日
編集済み: madhan ravi
2018 年 12 月 30 日
I don't even see any loop , I maybe blind but there lot of bugs
m=size(J0,2):
^--should be ;
Q is 2 X 2 but you try access until 4 columns (m is 4)
採用された回答
Stephen23
2018 年 12 月 30 日
編集済み: Stephen23
2018 年 12 月 30 日
"however, the code seems to loop infinitely many times I guess. I have no clue why? Is there anything wrong with the code??"
Your loop condition depends on three variables: qz, qh and tol. You don't change any of those variables inside the loop. So if the loops starts you will never exit from the loop because you do not change any of those three variables inside the loop and so the condition will remain exactly as it was when you first entered the loop.
2 件のコメント
Stephen23
2018 年 12 月 30 日
編集済み: Stephen23
2018 年 12 月 30 日
"x0 changes inside the loop so qz changes inside the loop."
"qh depends on h0 and h0 depeds on x0. And x0 changes inside the loop so is qh."
Nope. Because MATLAB is entirely pass by value, if you do not change the values of qx, qh, or tol inside the loop then their values will not magically change just because some other variable changes. Of course this is easy to check yourself: simply display their values on each iteration and you will see that qz and qh do not change.
You seem to be writing code based on rules of another language. This will not help you to understand MATLAB.
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!