Syntax question - renaming a variable

2 ビュー (過去 30 日間)
Lenilein
Lenilein 2019 年 1 月 28 日
コメント済み: Lenilein 2019 年 1 月 28 日
Dear Community,
I have a very basic syntax question:
I defined up=y(1) because I wish that matlab evaluates the diff(up) for every k and the syntax diff(y(1)) doesn't seem to work.
However I realized that after solving that upALL=cat(1,upALL,up) and the first column of yALL (so yALL(1)) don't show the same values even though I expect them to be strictly same. Also I expect that yALL and upALL return the same number of values over the same interval LALL.
Any hint?
Thanks!!
Ld=2.8; Ld1=3.4; Lv=1.3; Lv1=1.5;
s=125; LPool1=zeros(s,1);
for k=1:numel(LPool1)
if rem(k,2)==1 && k<98
LPool1(k)= (Ld+Lv)*(k-1)/2;
elseif rem(k,2)==1 && k>97
LPool1(k)= (Ld+Lv)*(97-1)/2+(Ld1+Lv1)*(k-97)/2;
elseif k<98
LPool1(k)=(k/2)*Ld+(k/2-1)*Lv;
elseif k>97
LPool1(k)=(96/2)*Ld+(96/2)*Lv +((k-96)/2)*Ld1+((k-96)/2-1)*Lv1;
end
end
LPool=LPool1.';
y0=[1.1,40];
LALL=[];yALL=[];upALL=[];
for k=1:numel(LPool)-1
[L,y]=ode45(@(L,y) myODE(L,y),LPool(k:k+1),y0); y0=y(end,:);
up=y(1);
upALL=cat(1,upALL,up); LALL=cat(1,LALL,L); yALL=cat(1,yALL,y);
end
function dy = myODE(L,y)
global u; u=y(1);
global Tp; Tp=y(2);
dudL = myODE1(L,u,Tp);
dTpdL = myODE2(L,u,Tp);
dy = [dudL;dTpdL];
end
function dudL = myODE1(L,u,Tp)
dudL=5*u+3*Tp;
end
function dTpdL=myODE2(L,u,Tp)
dTpdL=12*u+25*Tp;
end

採用された回答

Guillaume
Guillaume 2019 年 1 月 28 日
"I defined up=y(1) because I wish that matlab evaluates the diff(up) for every k and the syntax diff(y(1)) doesn't seem to work"
There is absolutely no difference between:
diff(y(1))
and
up = y(1);
diff(up)
They will give the exact same result. In addition since in both case, you're only passing a scalar value you will always get [] as a result.
"[...] and the first column of yALL (so yALL(1))"
No. y(1) and yALL(1) is never going to be the first column. It is the first element only. To get the first column:
y(:, 1) %all the rows of the first column
yAll(:, 1)
This is probably the cause of all your problems.
Beside this, get rid of the two global statements in your code. They do absolutely nothing useful and your code would work exactly the same without it. In fact, your 2nd loop could actually be rewritten as:
ode = @(~, y) [5*y(1)+3*y(2); 12*y(1)+25*y(2)]; %replaces your three function myODE, myODE1, myODE2
LALL = []; yALL = [];
for k = 1:numel(LPool)-1
[L, y] = ode45(ode, LPool(k:k+1), y0);
LALL = [LALL; L]; %clearer than writing cat(1, LALL, L)
yALL = [yALL; y];
end
upALL = yALL(:, 1); %1st column of yALL.
  1 件のコメント
Lenilein
Lenilein 2019 年 1 月 28 日
Thanks Guillaume for your very clear explanations!

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMathematics についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by