odeFunction: List variables through loop

I have some differential equations that I'm solving using the odeFunction. I am following the steps as described in the documentation. In this step:
[eqs,vars] = reduceDifferentialOrder(eqn,y(t));
I have variables like:
[eqs,vars] = reduceDifferentialOrder(eqn,[x1,x2,x3,x4,x5,x6,y1,y2,y3,y4,y5,y6]);
Now, this depends on a variable n. If n = 6, I have variables upto (x6,y6). For any other n, I have variables upto (xn,yn). I want to run a simulation where n is changing, but not drastically. Hence, I want to write those variables in a form dependent on n. Meaning, if n = 9, the vars array should automatically contain [x1,x2,x3,x4,x5,x6,x7,x8,x9,y1,y2,y3,y4,y5,y6,y7,y8,y9]. Is there a way to do this?

2 Commenti

Stephen23
Stephen23 il 3 Lug 2018
Modificato: Stephen23 il 3 Lug 2018
@Tejas Adsul: numbered variables are a sign that you are doing something wrong. Read this to know why:
I tried using cell array. I created T1 = {sym('x',[n,1])}, and then wrote T1{1} instead of x1,x2,etc. It still gave me an invalid variable '0' error.

Accedi per commentare.

 Risposta accettata

Stephen23
Stephen23 il 3 Lug 2018
Modificato: Stephen23 il 3 Lug 2018
Writing to file is slow and unnecessary, it is simpler and faster to just make the string directly:
>> Xs = sprintf(',x%d',1:9);
>> Ys = sprintf(',y%d',1:9);
>> str = sprintf('[%s,%s]',Xs(2:end),Ys(2:end));
>> vars = str2sym(str);

Più risposte (2)

You could combine [x1,x2,x3,x4,x5,x6,y1,y2,y3,y4,y5,y6] beforehand into a matrix XY. You would iteratively concatenate your x variables X = [x1,x2,x3,...] and your y variables Y = [y1,y2,y3,...] and then combine them at the end XY = [X, Y].
X = [];
Y = [];
for i = 1:n
x_i = rand(10,1);
X = [X, x_i];
y_i = rand(10,1);
Y = [Y, y_i];
end
XY = [X, Y];
[eqs,vars] = reduceDifferentialOrder(eqn,XY);
Just replace rand(10,1) with however you are initializing your variables.

3 Commenti

That works! Thanks!
Stephen23
Stephen23 il 3 Lug 2018
Modificato: Stephen23 il 3 Lug 2018
It is recommended to preallocate the arrays before the loop:
Okay no, this does not work. I'm not creating new variables. I already have x1,x2 etc in my equations. I just need to list them out in vars. I initialized my variables as x = sym('x',[n,1]) and same for y. But just writing 'x' in reduceDifferentialOrder didn't help. It gave 'invalid variable 0' error. Only explicitly writing out x1,x2,x3 etc does the job.

Accedi per commentare.

I found out a way. The reason I kept getting invalid variable '0' error was my equations had variables dependent on t (x1(t), x2(t),etc) while the variables I was providing in vars matrix were independent of t (x1, x2, etc). Anyway, what I did was create a text file vars.txt, and used fprintf in a loop to create the vars matrix in string form. Then, I read from that file using fileread, and used str2sym to get my vars matrix. It's not the most elegant way, but it works for now. Here's the code, if it helps anyone:
fileID = fopen('vars.txt','wt');
fprintf(fileID,'[');
for i = 1:n
fprintf(fileID,'x%d(t),',i);
end
for i = 1:n-1
fprintf(fileID,'y%d(t),',i);
end
fprintf(fileID,'y%d(t)]',i+1);
filename = 'vars.txt';
filetext = fileread(filename);
vars = str2sym(filetext);

Categorie

Prodotti

Release

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by