Effacer les filtres
Effacer les filtres

odeFunction: List variables through loop

2 vues (au cours des 30 derniers jours)
Tejas Adsul
Tejas Adsul le 2 Juil 2018
Modifié(e) : Stephen23 le 3 Juil 2018
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 commentaires
Stephen23
Stephen23 le 3 Juil 2018
Modifié(e) : Stephen23 le 3 Juil 2018
@Tejas Adsul: numbered variables are a sign that you are doing something wrong. Read this to know why:
Tejas Adsul
Tejas Adsul le 3 Juil 2018
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.

Connectez-vous pour commenter.

Réponse acceptée

Stephen23
Stephen23 le 3 Juil 2018
Modifié(e) : Stephen23 le 3 Juil 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);

Plus de réponses (2)

Jonathon Gibson
Jonathon Gibson le 2 Juil 2018
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 commentaires
Stephen23
Stephen23 le 3 Juil 2018
Modifié(e) : Stephen23 le 3 Juil 2018
It is recommended to preallocate the arrays before the loop:
Tejas Adsul
Tejas Adsul le 3 Juil 2018
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.

Connectez-vous pour commenter.


Tejas Adsul
Tejas Adsul le 3 Juil 2018
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);

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits


Version

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by