The professor asked to remake the C++ code in MATLAB.
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Gives the error "Unable to perform assignment because the size of the left side is 1-by-1 and the size of the right side is 9991-by-1." I'm not very smart to understand this. We need to find zz and plot the dependence of zz on temperature T. T varies from 10 to 10000. How to correctly place for in order for the program to work?
clc
clear all
nnucl = 1;
nH = 10.^-7;
nH2 = 10.^-3;
nHp = 10.^-2;
nOI = 10.^-8;
ne = 10.^-2;
kb = 1.3806488e-16;
g1g0 = 0.6;
E10 = 230.0;
A10 = 8.9.*(10.^-5);
g2g0 = 0.2;
E20 = 330.0;
A20 = 1.3.*(10.^-10);
g2g1 = 0.33333333333;
E21 = 98.0;
A21 = 1.8.*(10.^-5);
T = (10:10000)';
qH21 = (2.7.*(10.^-11).*(T.^0.362) + 3.46.*(10.^-11).*(T.^0.316)).*0.5;
qH1 = 9.20.*(10.^-11).*(T.^0.67);
qe1 = 5.21.*(10.^-10).*(T.^(-0.075));
qHp1 = 6.38.*(10.^-11).*(T.^0.4);
qH22 = (5.49.*(10.^-11).*(T .^0.317) + 7.07.*(10.^-11).*(T .^0.268)).*0.5;
qH2 = 4.30.*(10.^-11).*(T .^0.8);
qe2 = 4.86.*(10.^-10).*(T .^-0.026);
qHp2 = 6.10.*(10.^-13).*(T .^1.1);
qH23 = (2.74.*(10.^-14).*(T .^1.06) + 3.33.*(10.^-15).*(T .^1.360)).*0.5;
qH3 = 1.10.*(10.^-10).*(T .^0.44);
qe3 = 1.08.*(10.^-14).*(T .^0.926);
qHp3 = 3.43.*(10.^-10).*(T .^0.19);
C10 = zeros(1,5);
C20 = zeros(1,5);
C21 = zeros(1,5);
for r=1:5
C10(:,r) = (qH21.*qH21 + qH1.*nH + qHp1.*qHp1 + ne.*qe1);
C20(:,r)= (qH22.*qH22 + qH2.*nH + qHp2.*qHp2 + ne.*qe2);
C21(:,r)= (qH23.*qH23 + qH3.*nH + qHp3.*qHp3 + ne.*qe3);
end
C01 = C10.*g1g0.*exp(-E10./T);
C02 = C20.*g2g0.*exp(-E20./T);
C12= C21.*g2g1.*exp(-E21./T);
tmp = (C01 + C02);
P = ( A10 + C10)./tmp;
Q = ( A20 + C20)./tmp;
tmp = ( C10 + C12);
V=C01./tmp;
W=( A21 + C21)./tmp;
K0 = (P.*W + Q)./(1 - P.*V);
K1 = V.*K0 + W;
n2 = (1 + K0 + K1);
n1 = K1.* n2;
n0 = K0.* n2;
zz=(A10.*E10.*n1 +(A20.*E20+A21.*E21).*n2);
plot (T,zz)
Unable to perform assignment because the size of the left side is 1-by-1 and the size of the right side is 9991-by-1.
Error in finestructures (line 46)
C10(:,r) = (qH21.*qH21 + qH1.*nH + qHp1.*qHp1 + ne.*qe1);
0 commentaires
Réponses (3)
Walter Roberson
le 17 Mar 2022
Modifié(e) : Walter Roberson
le 17 Mar 2022
T = (10:10000)';
Large vector. 9991 x 1 elements.
qH21 = (2.7.*(10.^-11).*(T.^0.362) + 3.46.*(10.^-11).*(T.^0.316)).*0.5;
qH1 = 9.20.*(10.^-11).*(T.^0.67);
qe1 = 5.21.*(10.^-10).*(T.^(-0.075));
qHp1 = 6.38.*(10.^-11).*(T.^0.4);
qH22 = (5.49.*(10.^-11).*(T .^0.317) + 7.07.*(10.^-11).*(T .^0.268)).*0.5;
qH2 = 4.30.*(10.^-11).*(T .^0.8);
qe2 = 4.86.*(10.^-10).*(T .^-0.026);
qHp2 = 6.10.*(10.^-13).*(T .^1.1);
qH23 = (2.74.*(10.^-14).*(T .^1.06) + 3.33.*(10.^-15).*(T .^1.360)).*0.5;
qH3 = 1.10.*(10.^-10).*(T .^0.44);
qe3 = 1.08.*(10.^-14).*(T .^0.926);
qHp3 = 3.43.*(10.^-10).*(T .^0.19);
Those all use all of the vector T, so all of the results are length 9991 x 1.
for r=1:5
C10(:,r) = (qH21.*qH21 + qH1.*nH + qHp1.*qHp1 + ne.*qe1);
C20(:,r)= (qH22.*qH22 + qH2.*nH + qHp2.*qHp2 + ne.*qe2);
C21(:,r)= (qH23.*qH23 + qH3.*nH + qHp3.*qHp3 + ne.*qe3);
end
You use r as an index for the destination, but you do not use r as an index for any of the right-hand sides, so each iteration is going to produce exactly the same size.
As discussed above, each of those variables such as qH21 are 9991 x 1, so the right hand side of each of the calculations is 9991 x 1.
But with you having pre-initialized C10, C20, C21 to 1 x 5, then C10(:,r) designates a scalar location C10(1,r) . Which is a problem because the right hand side is 9991 x 1.
You need to figure out why you are looping over r there. and what size of output you are expecting.
C01 = C10.*g1g0.*exp(-E10./T);
C10 was declared 1 x 5. You .* that with a calculation based on T which is 9991 x 1. That is potentially possible in MATLAB, giving a 9991 x 5 result.
Those would probably lead to zz being 9991 x 5. In the plot(T, zz) that would result in 5 draw lines, each with 9991 points in the line. Is that what you are looking for?
0 commentaires
Egor Popov
le 19 Mar 2022
Modifié(e) : Egor Popov
le 19 Mar 2022
2 commentaires
Walter Roberson
le 19 Mar 2022
We need to find zz and plot the dependence of zz on temperature T
That does not require a for loop.
C10 = (qH21.*qH21 + qH1.*nH + qHp1.*qHp1 + ne.*qe1);
Torsten
le 19 Mar 2022
Don't know if this is what you want:
nnucl = 1;
nH = 10.^-7;
nH2 = 10.^-3;
nHp = 10.^-2;
nOI = 10.^-8;
ne = 10.^-2;
kb = 1.3806488e-16;
g1g0 = 0.6;
E10 = 230.0;
A10 = 8.9.*(10.^-5);
g2g0 = 0.2;
E20 = 330.0;
A20 = 1.3.*(10.^-10);
g2g1 = 0.33333333333;
E21 = 98.0;
A21 = 1.8.*(10.^-5);
T = (10:100)';
qH21 = (2.7.*(10.^-11).*(T.^0.362) + 3.46.*(10.^-11).*(T.^0.316)).*0.5;
qH1 = 9.20.*(10.^-11).*(T.^0.67);
qe1 = 5.21.*(10.^-10).*(T.^(-0.075));
qHp1 = 6.38.*(10.^-11).*(T.^0.4);
qH22 = (5.49.*(10.^-11).*(T .^0.317) + 7.07.*(10.^-11).*(T .^0.268)).*0.5;
qH2 = 4.30.*(10.^-11).*(T .^0.8);
qe2 = 4.86.*(10.^-10).*(T .^-0.026);
qHp2 = 6.10.*(10.^-13).*(T .^1.1);
qH23 = (2.74.*(10.^-14).*(T .^1.06) + 3.33.*(10.^-15).*(T .^1.360)).*0.5;
qH3 = 1.10.*(10.^-10).*(T .^0.44);
qe3 = 1.08.*(10.^-14).*(T .^0.926);
qHp3 = 3.43.*(10.^-10).*(T .^0.19);
%C10 = zeros(1,5);
%C20 = zeros(1,5);
%C21 = zeros(1,5);
%for r=1:5
% C10(:,r) = (qH21.*qH21 + qH1.*nH + qHp1.*qHp1 + ne.*qe1);
% C20(:,r)= (qH22.*qH22 + qH2.*nH + qHp2.*qHp2 + ne.*qe2);
% C21(:,r)= (qH23.*qH23 + qH3.*nH + qHp3.*qHp3 + ne.*qe3);
%end
C10 = (qH21.*qH21 + qH1.*nH + qHp1.*qHp1 + ne.*qe1);
C20= (qH22.*qH22 + qH2.*nH + qHp2.*qHp2 + ne.*qe2);
C21= (qH23.*qH23 + qH3.*nH + qHp3.*qHp3 + ne.*qe3);
C01 = C10.*g1g0.*exp(-E10./T);
C02 = C20.*g2g0.*exp(-E20./T);
C12= C21.*g2g1.*exp(-E21./T);
tmp = (C01 + C02);
P = ( A10 + C10)./tmp;
Q = ( A20 + C20)./tmp;
tmp = ( C10 + C12);
V=C01./tmp;
W=( A21 + C21)./tmp;
K0 = (P.*W + Q)./(1 - P.*V);
K1 = V.*K0 + W;
n2 = (1 + K0 + K1);
n1 = K1.* n2;
n0 = K0.* n2;
zz=(A10.*E10.*n1 +(A20.*E20+A21.*E21).*n2);
plot (T,zz)
0 commentaires
Voir également
Catégories
En savoir plus sur Startup and Shutdown dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!