% % heat_code.m %
Code computes optimal parameters, the sensitivity matrices, and covariance matrix for the aluminum rod data analyzied in Example 7.16.
Required functions: heat_fun_al.m Required data: final_al_data.txt
clear all close all global data_al xdata % % Load the data and construct the x datapoints. % load final_al_data.txt data_al = final_al_data(2:16); xdata = [10 14 18 22 26 30 34 38 42 46 50 54 58 62 66]; xvals = [10:.1:70]; u_amb = final_al_data(17);
Input dimensions and material constants for the alumunim rod.
a = 0.95; % cm b = 0.95; % cm L = 70.0; % cm k = 2.37; % W/cm C n = 15; % Number of measurements p = 2; % Number of parameters
Optimize parameters and construct increments used when approximating sensitivities using finite differences. The representations are truncated to two significant digits to remain consistent with the measured temperatures.
h_init = 0.00183; Q_init = -15.93; q_init = [h_init Q_init]; modelfun = @(q)heat_fun_al(q,a,b,L,k,u_amb); [q_opt,fval] = fminsearch(modelfun,q_init); h = q_opt(1); Q = q_opt(2); h = 0.00191; Q = -18.41; dh = 1e-10; dQ = 1e-4; h_p = h + dh; Q_p = Q + dQ;
Construct constants and analytic solution to the steady state heat equation.
gamma = sqrt(2*(a+b)*h/(a*b*k)); gamma_h = (1/(2*h))*gamma; f1 = exp(gamma*L)*(h + k*gamma); f2 = exp(-gamma*L)*(h - k*gamma); f3 = f1/(f2 + f1); f1_h = exp(gamma*L)*(gamma_h*L*(h+k*gamma) + 1 + k*gamma_h); f2_h = exp(-gamma*L)*(-gamma_h*L*(h-k*gamma) + 1 - k*gamma_h); c1 = -Q*f3/(k*gamma); c2 = Q/(k*gamma) + c1; f4 = Q/(k*gamma*gamma); den2 = (f1+f2)^2; f3_h = (f1_h*(f1+f2) - f1*(f1_h+f2_h))/den2; c1_h = f4*gamma_h*f3 - (Q/(k*gamma))*f3_h; c2_h = -f4*gamma_h + c1_h; c1_Q = -(1/(k*gamma))*f3; c2_Q = (1/(k*gamma)) + c1_Q; gamma_hp = sqrt(2*(a+b)*h_p/(a*b*k)); f1_hp = exp(gamma_hp*L)*(h_p + k*gamma_hp); f2_hp = exp(-gamma_hp*L)*(h_p - k*gamma_hp); f3_hp = f1_hp/(f2_hp + f1_hp); c1_hp = -Q*f3_hp/(k*gamma_hp); c2_hp = Q/(k*gamma_hp) + c1_hp; c1_Qp = -Q_p*f3/(k*gamma); c2_Qp = Q_p/(k*gamma) + c1_Qp; uvals = c1*exp(-gamma*xvals) + c2*exp(gamma*xvals) + u_amb; uvals_data = c1*exp(-gamma*xdata) + c2*exp(gamma*xdata) + u_amb; uvals_Q_data = c1_Q*exp(-gamma*xdata) + c2_Q*exp(gamma*xdata); uvals_h_data = c1_h*exp(-gamma*xdata) + c2_h*exp(gamma*xdata) + gamma_h*xdata.*(-c1*exp(-gamma*xdata) + c2*exp(gamma*xdata)); uvals_data_hp = c1_hp*exp(-gamma_hp*xdata) + c2_hp*exp(gamma_hp*xdata) +u_amb; uvals_data_Qp = c1_Qp*exp(-gamma*xdata) + c2_Qp*exp(gamma*xdata) + u_amb; S_d = [ones(1,15); xdata; xdata.^2; xdata.^3; xdata.^4]; h_fd = (1/dh)*(uvals_data_hp - uvals_data); Q_fd = (1/dQ)*(uvals_data_Qp - uvals_data); res = data_al - uvals_data;
Plot the model fit and residuals.
figure(1) plot(xvals,uvals,'linewidth',2) axis([5 70 20 100]) hold on plot(xdata,data_al,'o','linewidth',5) hold off set(gca,'Fontsize',[20]); xlabel('Distance (cm)') ylabel('Temperature (^oC)') legend('Model','Data','Location','Northeast') figure(2) plot(xdata,res,'o','linewidth',6) axis([10 70 -.6 .4]) hold on plot(xvals,0*xvals,'linewidth',2) hold off set(gca,'Fontsize',[20]); xlabel('Distance (cm)') ylabel('Residuals (^oC)')
Construct the analytic and finite difference sensitivity matrices.
sens_mat = [uvals_Q_data; uvals_h_data] sens_mat_fd = [Q_fd; h_fd] % % Construct the measurment covariance sigma2 and the covariance matrices % V and V_fd constructed using the analytic and finite difference % sensitivity relations. % format short e sigma2 = (1/(n-p))*res*res'; V = sigma2*inv(sens_mat*sens_mat') V_fd = sigma2*inv(sens_mat_fd*sens_mat_fd')
sens_mat = Columns 1 through 6 -4.0501e+00 -3.2100e+00 -2.5449e+00 -2.0187e+00 -1.6025e+00 -1.2738e+00 -3.1056e+04 -2.8266e+04 -2.5323e+04 -2.2416e+04 -1.9666e+04 -1.7143e+04 Columns 7 through 12 -1.0145e+00 -8.1051e-01 -6.5075e-01 -5.2648e-01 -4.3093e-01 -3.5888e-01 -1.4882e+04 -1.2897e+04 -1.1187e+04 -9.7437e+03 -8.5538e+03 -7.6028e+03 Columns 13 through 15 -3.0640e-01 -2.7063e-01 -2.4962e-01 -6.8770e+03 -6.3645e+03 -6.0561e+03 sens_mat_fd = Columns 1 through 6 -4.0501e+00 -3.2100e+00 -2.5449e+00 -2.0187e+00 -1.6025e+00 -1.2738e+00 -3.1056e+04 -2.8266e+04 -2.5323e+04 -2.2416e+04 -1.9666e+04 -1.7143e+04 Columns 7 through 12 -1.0145e+00 -8.1051e-01 -6.5075e-01 -5.2648e-01 -4.3093e-01 -3.5888e-01 -1.4882e+04 -1.2897e+04 -1.1187e+04 -9.7437e+03 -8.5538e+03 -7.6028e+03 Columns 13 through 15 -3.0640e-01 -2.7063e-01 -2.4962e-01 -6.8770e+03 -6.3644e+03 -6.0561e+03 V = 2.1034e-02 -2.0286e-06 -2.0286e-06 2.0972e-10 V_fd = 2.1034e-02 -2.0286e-06 -2.0286e-06 2.0972e-10
Construct the 95% confidence intervals.
tval = 2.1604; int_Q = [Q - sqrt(V(1,1))*tval Q + sqrt(V(1,1))*tval] int_h = [h - sqrt(V(2,2))*tval h + sqrt(V(2,2))*tval] % % Plot the sensitivities obtained analytically and using finite differences % to show that to within visual accuracy, they are the same. % figure(3) plot(xdata,uvals_Q_data,'o',xdata,Q_fd,'x','linewidth',6) axis([0 70 -5 0]) set(gca,'Fontsize',[20]); xlabel('Distance (cm)') ylabel('Sensitivity in \Phi') legend('Analytic','Finite Difference','Location','Southeast') figure(4) plot(xdata,uvals_h_data,'o',xdata,h_fd,'x','linewidth',6) axis([0 70 -3.5e4 -0.5e4]) set(gca,'Fontsize',[20]); xlabel('Distance (cm)') ylabel('Sensitivity in h') legend('Analytic','Finite Difference','Location','Southeast')
int_Q = -1.8723e+01 -1.8097e+01 int_h = 1.8787e-03 1.9413e-03