How to get out of this error:'You can not subscript a table using only one subscript. Table subscripting requires both row and variable subscripts', while data fitting in NRTL thermodynamic model
1 次查看(过去 30 天)
显示 更早的评论
I am trying to data fit in NRTL thermodynamic model where i have Five input variables which i wrote it in one matrix xd, and one output accroding to that five input that i wrote it in yd column matrix. where 'a' is Constants that i want to get for this Data. alpha is another constant which value remains same and which value input we also gave.
below is my code:
clear all;
clc;
alpha=0.3;
xd(:,1) = readtable('Data2.xlsx','Sheet',1,'Range','A2:A41')
xd(:,2) = readtable('Data2.xlsx','Sheet',1,'Range','B2:B41')
xd(:,3) = readtable('Data2.xlsx','Sheet',1,'Range','C2:C41')
xd(:,4) = readtable('Data2.xlsx','Sheet',1,'Range','D2:D41')
xd(:,5) = readtable('Data2.xlsx','Sheet',1,'Range','E2:E41')
yd = readtable('Data2.xlsx','Sheet',2,'Range','A2:A41')
a0=[-68.7129 -5.3215 0.0615 -13.7754 -7.7847 -73.611 -0.4944 -1.5439 -0.0677 1.5985 1.5728 0.4826];
for K = 1 : height(yd)
options = optimoptions('lsqcurvefit','Algorithm','trust-region-reflective','MaxFunEvals',800000,'MaxIter',300000,'TolX',1e-10,'TolFun',1e-10)
lb = [];
ub = [];
[a{K}, resnorm{K}]= lsqcurvefit( @(a,xd) curvefit_multiobjective_two(a, xd{K}), a0, xd{K} , yd{K}, lb, ub, options);
end
C=[0 a(1) a(2); a(3) 0 a(4); a(5) a(6) 0]
D=[0 a(7) a(8); a(9) 0 a(10); a(11) a(12) 0]
where NRTL data is also attached below:(Pl. note that actual data is not listed for security purposes)
File name for data is : Data2.xlsx
the calling function code is written below:
function yd=curvefit_multiobjective_two(a,xd)
alpha=0.3;
tow11=0;
tow12=(a(1)+(a(7)./(xd(:,1))));
tow13=(a(2)+(a(8)./(xd(:,1))));
tow21=(a(3)+(a(9)./(xd(:,1))));
tow22=0;
tow23=(a(4)+(a(10)./(xd(:,1))));
tow31=(a(5)+(a(11)./(xd(:,1))));
tow32=(a(6)+(a(12)./(xd(:,1))));
tow33=0;
G11=exp(-alpha.*tow11);
G12=exp(-alpha.*tow12);
G13=exp(-alpha.*tow13);
G21=exp(-alpha.*tow21);
G22=exp(-alpha.*tow22);
G23=exp(-alpha.*tow23);
G31=exp(-alpha.*tow31);
G32=exp(-alpha.*tow32);
G33=exp(-alpha.*tow33);
a1=((xd(:,2).*tow11.*G11)+(xd(:,3).*tow21.*G21)+((1-xd(:,2)-xd(:,3)).*tow31.*G31))./((xd(:,2).*G11)+(xd(:,3).*G21)+((1-xd(:,2)-xd(:,3)).*G31));
a2=((xd(:,2).*G11)./((xd(:,2).*G11)+(xd(:,3).*G21)+((1-xd(:,2)-xd(:,3)).*G31))).*(tow11-(((xd(:,2).*tow11.*G11)+(xd(:,3).*tow21.*G21)+((1-xd(:,2)-xd(:,3)).*tow31.*G31))./((xd(:,2).*G11)+(xd(:,3).*G21)+((1-xd(:,2)-xd(:,3)).*G31))));
a3=((xd(:,3).*G12)./((xd(:,2).*G12)+(xd(:,3).*G22)+((1-xd(:,2)-xd(:,3)).*G32))).*(tow12-(((xd(:,2).*tow12.*G12)+(xd(:,3).*tow22.*G22)+((1-xd(:,2)-xd(:,3)).*tow32.*G32))./((xd(:,2).*G12)+(xd(:,3).*G22)+((1-xd(:,2)-xd(:,3)).*G32))));
a4=(((1-xd(:,2)-xd(:,3)).*G13)./((xd(:,2).*G13)+(xd(:,3).*G23)+((1-xd(:,2)-xd(:,3)).*G33))).*(tow13-(((xd(:,2).*tow13.*G13)+(xd(:,3).*tow23.*G23)+((1-xd(:,2)-xd(:,3)).*tow33.*G33))./((xd(:,2).*G13)+(xd(:,3).*G23)+((1-xd(:,2)-xd(:,3)).*G33))));
a5=((xd(:,2).*tow12.*G12)+(xd(:,3).*tow22.*G22)+((1-xd(:,2)-xd(:,3)).*tow32.*G32))./((xd(:,2).*G12)+(xd(:,3).*G22)+((1-xd(:,2)-xd(:,3)).*G32));
a6=((xd(:,2).*G21)./((xd(:,2).*G11)+(xd(:,3).*G21)+((1-xd(:,2)-xd(:,3)).*G31))).*(tow21-(((xd(:,2).*tow11.*G11)+(xd(:,3).*tow21.*G21)+((1-xd(:,2)-xd(:,3)).*tow31.*G31))./((xd(:,2).*G11)+(xd(:,3).*G21)+((1-xd(:,2)-xd(:,3)).*G31))));
a7=((xd(:,3).*G22)./((xd(:,2).*G12)+(xd(:,3).*G22)+((1-xd(:,2)-xd(:,3)).*G32))).*(tow22-(((xd(:,2).*tow12.*G12)+(xd(:,3).*tow22.*G22)+((1-xd(:,2)-xd(:,3)).*tow32.*G32))./((xd(:,2).*G12)+(xd(:,3).*G22)+((1-xd(:,2)-xd(:,3)).*G32))));
a8=(((1-xd(:,2)-xd(:,3)).*G23)./((xd(:,2).*G13)+(xd(:,3).*G23)+((1-xd(:,2)-xd(:,3)).*G33))).*(tow23-(((xd(:,2).*tow13.*G13)+(xd(:,3).*tow23.*G23)+((1-xd(:,2)-xd(:,3)).*tow33.*G33))./((xd(:,2).*G13)+(xd(:,3).*G23)+((1-xd(:,2)-xd(:,3)).*G33))));
gamma_one=exp(a1+a2+a3+a4);
gamma_two=exp(a5+a6+a7+a8);
yd=(xd(:,2).*gamma_one.*xd(:,4))+(xd(:,3).*gamma_two.*xd(:,5));
end
please help me out of this error:'You can not subscript a table using only one subscript. Table subscripting requires both row and variable subscripts.'
Thank you in advance.
0 个评论
采纳的回答
Walter Roberson
2020-1-13
[a{K}, resnorm{K}]= lsqcurvefit( @(a,xd) curvefit_multiobjective_two(a, xd{K}), a0, xd{K} , yd{K}, lb, ub, options);
The xd inside the @ function definition is not the same xd as after the a0 in the call. The one after the a0 is a table object. When you access a table object with {} indexing, you must use two subscripts, such xd{K,:}
3 个评论
Walter Roberson
2020-1-13
[a{K}, resnorm{K}]= lsqcurvefit( @curvefit_multiobjective_two, a0, xd{K, :}, yd{K, :}, lb, ub, options) ;
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Thermodynamics and Heat Transfer 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!