Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include "fvar.hpp"
00012 void dfbltsolve(void);
00013
00018 dvar_vector solve(const banded_lower_triangular_dvar_matrix& m,
00019 const dvar_vector &v)
00020 {
00021 int bw=m.bandwidth();
00022 int imin=m.indexmin();
00023 int imax=m.indexmax();
00024 dvar_vector x(imin,imax);
00025 x.elem_value(imin)=v.elem_value(imin)/m.elem_value(imin,imin);
00026 for (int i=imin+1;i<=imax;i++)
00027 {
00028 int jmin=admax(imin,i-bw+1);
00029 double ssum=0.0;
00030 for (int j=jmin;j<=i-1;j++)
00031 {
00032 ssum+=m.elem_value(i,j)*x.elem_value(j);
00033 }
00034 x.elem_value(i)=(v.elem_value(i)-ssum)/m.elem_value(i,i);
00035 }
00036 save_identifier_string("rt");
00037 m.save_dvar_matrix_value();
00038 m.save_dvar_matrix_position();
00039 v.save_dvar_vector_value();
00040 v.save_dvar_vector_position();
00041 x.save_dvar_vector_position();
00042 save_identifier_string("ww");
00043 gradient_structure::GRAD_STACK1->
00044 set_gradient_stack(dfbltsolve);
00045 return x;
00046 }
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00084 void dfbltsolve(void)
00085 {
00086 verify_identifier_string("ww");
00087 dvar_vector_position xpos=restore_dvar_vector_position();
00088 dvar_vector_position vpos=restore_dvar_vector_position();
00089 dvector v=restore_dvar_vector_value(vpos);
00090 dvar_matrix_position mpos=restore_dvar_matrix_position();
00091 banded_lower_triangular_dmatrix m=
00092 restore_banded_lower_triangular_dvar_matrix_value(mpos);
00093 verify_identifier_string("rt");
00094 dvector dfx=
00095 restore_dvar_vector_derivatives(xpos);
00096
00097 int bw=m.bandwidth();
00098 int imin=m.indexmin();
00099 int imax=m.indexmax();
00100
00101 banded_lower_triangular_dmatrix dfm(imin,imax,bw);
00102 dvector x(imin,imax);
00103 dvector dfv(imin,imax);
00104 dfm.initialize();
00105 dfv.initialize();
00106 x(imin)=v(1)/m(1,1);
00107 dvector dfsum(imin,imax);
00108 dfsum.initialize();
00109 dvector ssum(imin,imax);
00110 ssum.initialize();
00111 int i;
00112 for (i=2;i<=imax;i++)
00113 {
00114 int jmin=admax(1,i-bw+1);
00115 for (int j=jmin;j<=i-1;j++)
00116 {
00117 ssum(i)+=m(i,j)*x(j);
00118 }
00119 x(i)=(v(i)-ssum(i))/m(i,i);
00120 }
00121
00122 for (i=imax;i>=2;i--)
00123 {
00124 int jmin=admax(1,i-bw+1);
00125
00126 dfv(i)+=dfx(i)/m(i,i);
00127 dfsum(i)-=dfx(i)/m(i,i);
00128 dfm(i,i)-=dfx(i)*(v(i)-ssum(i))/(m(i,i)*m(i,i));
00129 dfx(i)=0.0;
00130 for (int j=i-1;j>=jmin;j--)
00131 {
00132
00133 dfm(i,j)+=dfsum(i)*x(j);
00134 dfx(j)+=dfsum(i)*m(i,j);
00135 }
00136 }
00137
00138
00139
00140
00141
00142 dfv(imin)+=dfx(imin)/m(imin,imin);
00143 dfm(imin,imin)-=dfx(imin)*v(imin)/(m(imin,imin)*m(imin,imin));
00144 dfx(imin)=0.0;
00145
00146 dfm.save_dmatrix_derivatives(mpos);
00147 dfv.save_dvector_derivatives(vpos);
00148 }