how to return the solution of a vector of variables one time instead of indexing sol.x1, solx2..etc

1 回表示 (過去 30 日間)
Hi. For a system of linear equations, using solve fun, I want to return the solution for all the variables one time. with this function, I can call each solution by indexing which is not practical when I have many variables.
How could I call/return the solution for all the variables one time instead of indexing each variable individually, please?
I need to use the output solutions (solved variables) in another formula. see last 2 lines in the code where I used the for loop for this purpose.
for a large number of variables does not sound practical to call all the variables using the indexing: sol.f1, sol.f2, ...sol.fn for the solution of (f) vector of variables
Here is the code
k_tt=1; k_bt=-3.4744;k_tb=-3.4744;k_bb=18.5263;vp=0.3;
prompt={'a:','N:'};
title='Input';
answer=inputdlg(prompt,title);
a = str2double(answer{1});
N = str2double(answer{2});gam=zeros(N+1,N+1);delt=zeros(N+1,N+1);
A=zeros(N+1,N+1);B=zeros(N+1,N+1);C=zeros(N,N);D=zeros(N,N);Delta=zeros(N+1,1);Delta(1,1)=1;
for ii=0:N
i2=ii+1;
for jj=0:N
jj2=jj+1;
k=ii+jj;
kk=mod(k,2);
if kk==1
gama=0;
else gama=(4*(ii+1)*(jj+1))/((ii+jj+3)*(ii+jj+1)*(ii-jj+1)*(jj-ii+1));
end
gam(i2,jj2)=gama;
if ii==jj
delta1=1;
else delta1=0;
end
delt(i2,jj2)=delta1;
A(i2,jj2)=0.25*pi*(ii+1)*delta1+k_tt*a*gama;
B(i2,jj2)=k_tb*a*gama;
C(i2,jj2)=k_bt*a*gama;
D(i2,jj2)=((3*(3+vp)*pi)/(4*(1+vp)))*(ii+1)*delta1*+k_bb*a*gama;
end
end
f=sym('f',[N+1 1]);g=sym('g',[N+1 1]);
eqns=[A*f+B*g==(pi/2)*Delta,C*f+D*g==(pi/2)*Delta];
S=solve(eqns);
sol =vpasolve(eqns,[f;g]);
sol2=[S.f1;S.g1]; % this way works but I have to call all the variable indivdully! what if I have 100 variables ..i.e. f1...f100, do I need to use (sol.f1 all the way to sol.100)
% the reason is I need to use the solutions in another formula as below
h_1=0
for x=0:N
h_1=h_1+(1+x)* *f(x,1); %f(x,1) refers to the solved variables f1,f2,f3 ... I do not know how to call them here!
end

採用された回答

Stephen23
Stephen23 2018 年 11 月 12 日
編集済み: Stephen23 2018 年 11 月 12 日
You can dynamically access fieldnames:
For example:
S = vpasolve(...);
for k = 1:100
F = sprintf('f%d',k);
S.(F)
end
Another option is to use struct2cell and a comma-separated list:
S = vpasolve(...);
C = struct2cell(S);
V = [C{:}]
You can also use indexing into C to get specific values. You might also find orderfields and/or fieldnames useful (then you can sort the fields and select from fields that actually exist in the structure).
Read more about comma-separated lists:

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeOrdinary Differential Equations についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by