Commit 126a3aed07763d1b0975159db844a6348597f38e
1 parent
967bc474e2
Exists in
master
and in
3 other branches
git-svn-id: https://lxsd.femto-st.fr/svn/fvn@23 b657c933-2333-4658-acf2-d3c7c2708721
Showing 1 changed file with 124 additions and 1 deletions Side-by-side Diff
fvnlib.f90
| ... | ... | @@ -1099,6 +1099,10 @@ |
| 1099 | 1099 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| 1100 | 1100 | ! |
| 1101 | 1101 | ! |
| 1102 | + | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1102 | 1106 | subroutine fvn_d_lspoly(np,x,y,deg,coeff,status) |
| 1103 | 1107 | ! |
| 1104 | 1108 | ! Least square polynomial fitting |
| ... | ... | @@ -1123,6 +1127,125 @@ |
| 1123 | 1127 | integer, intent(out) :: status |
| 1124 | 1128 | |
| 1125 | 1129 | real(kind=8), allocatable, dimension(:,:) :: mat,bmat |
| 1130 | +real(kind=8),dimension(:),allocatable :: work | |
| 1131 | +real(kind=8),dimension(1) :: twork | |
| 1132 | +integer :: lwork,info | |
| 1133 | + | |
| 1134 | +integer :: i,j | |
| 1135 | + | |
| 1136 | +status=1 | |
| 1137 | +allocate(mat(np,deg+1),bmat(np,1)) | |
| 1138 | + | |
| 1139 | +! Design matrix valorisation | |
| 1140 | +mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) | |
| 1141 | + | |
| 1142 | +! second member valorisation | |
| 1143 | +bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) | |
| 1144 | + | |
| 1145 | +! query workspace size | |
| 1146 | +call dgels('N',np,deg+1,1,mat,np,bmat,np,twork,-1,info) | |
| 1147 | +lwork=twork(1) | |
| 1148 | +allocate(work(int(lwork))) | |
| 1149 | +! real call | |
| 1150 | +call dgels('N',np,deg+1,1,mat,np,bmat,np,work,lwork,info) | |
| 1151 | + | |
| 1152 | +if (info /= 0) then | |
| 1153 | + status=0 | |
| 1154 | +end if | |
| 1155 | + | |
| 1156 | + coeff = (/ (bmat(i,1),i=1,deg+1) /) | |
| 1157 | + | |
| 1158 | +deallocate(work) | |
| 1159 | +deallocate(mat,bmat) | |
| 1160 | +end subroutine | |
| 1161 | + | |
| 1162 | +subroutine fvn_s_lspoly(np,x,y,deg,coeff,status) | |
| 1163 | +! | |
| 1164 | +! Least square polynomial fitting | |
| 1165 | +! | |
| 1166 | +! Find the coefficients of the least square polynomial of a given degree | |
| 1167 | +! for a set of coordinates. | |
| 1168 | +! | |
| 1169 | +! The degree must be lower than the number of points | |
| 1170 | +! | |
| 1171 | +! np (in) : number of points | |
| 1172 | +! x(np) (in) : x data | |
| 1173 | +! y(np) (in) : y data | |
| 1174 | +! deg (in) : polynomial's degree | |
| 1175 | +! coeff(deg+1) (out) : polynomial coefficients | |
| 1176 | +! status (out) : =0 if a problem occurs | |
| 1177 | +! | |
| 1178 | +implicit none | |
| 1179 | + | |
| 1180 | +integer, intent(in) :: np,deg | |
| 1181 | +real(kind=4), intent(in), dimension(np) :: x,y | |
| 1182 | +real(kind=4), intent(out), dimension(deg+1) :: coeff | |
| 1183 | +integer, intent(out) :: status | |
| 1184 | + | |
| 1185 | +real(kind=4), allocatable, dimension(:,:) :: mat,bmat | |
| 1186 | +real(kind=4),dimension(:),allocatable :: work | |
| 1187 | +real(kind=4),dimension(1) :: twork | |
| 1188 | +integer :: lwork,info | |
| 1189 | + | |
| 1190 | +integer :: i,j | |
| 1191 | + | |
| 1192 | +status=1 | |
| 1193 | +allocate(mat(np,deg+1),bmat(np,1)) | |
| 1194 | + | |
| 1195 | +! Design matrix valorisation | |
| 1196 | +mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) | |
| 1197 | + | |
| 1198 | +! second member valorisation | |
| 1199 | +bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) | |
| 1200 | + | |
| 1201 | +! query workspace size | |
| 1202 | +call sgels('N',np,deg+1,1,mat,np,bmat,np,twork,-1,info) | |
| 1203 | +lwork=twork(1) | |
| 1204 | +allocate(work(int(lwork))) | |
| 1205 | +! real call | |
| 1206 | +call sgels('N',np,deg+1,1,mat,np,bmat,np,work,lwork,info) | |
| 1207 | + | |
| 1208 | +if (info /= 0) then | |
| 1209 | + status=0 | |
| 1210 | +end if | |
| 1211 | + | |
| 1212 | + coeff = (/ (bmat(i,1),i=1,deg+1) /) | |
| 1213 | + | |
| 1214 | +deallocate(work) | |
| 1215 | +deallocate(mat,bmat) | |
| 1216 | +end subroutine | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
| 1225 | +subroutine fvn_d_lspoly_svd(np,x,y,deg,coeff,status) | |
| 1226 | +! | |
| 1227 | +! Least square polynomial fitting | |
| 1228 | +! | |
| 1229 | +! Find the coefficients of the least square polynomial of a given degree | |
| 1230 | +! for a set of coordinates. | |
| 1231 | +! | |
| 1232 | +! The degree must be lower than the number of points | |
| 1233 | +! | |
| 1234 | +! np (in) : number of points | |
| 1235 | +! x(np) (in) : x data | |
| 1236 | +! y(np) (in) : y data | |
| 1237 | +! deg (in) : polynomial's degree | |
| 1238 | +! coeff(deg+1) (out) : polynomial coefficients | |
| 1239 | +! status (out) : =0 if a problem occurs | |
| 1240 | +! | |
| 1241 | +implicit none | |
| 1242 | + | |
| 1243 | +integer, intent(in) :: np,deg | |
| 1244 | +real(kind=8), intent(in), dimension(np) :: x,y | |
| 1245 | +real(kind=8), intent(out), dimension(deg+1) :: coeff | |
| 1246 | +integer, intent(out) :: status | |
| 1247 | + | |
| 1248 | +real(kind=8), allocatable, dimension(:,:) :: mat,bmat | |
| 1126 | 1249 | real(kind=8),dimension(:),allocatable :: work,singval |
| 1127 | 1250 | real(kind=8),dimension(1) :: twork |
| 1128 | 1251 | integer :: lwork,info,rank |
| ... | ... | @@ -1155,7 +1278,7 @@ |
| 1155 | 1278 | deallocate(mat,bmat,singval) |
| 1156 | 1279 | end subroutine |
| 1157 | 1280 | |
| 1158 | -subroutine fvn_s_lspoly(np,x,y,deg,coeff,status) | |
| 1281 | +subroutine fvn_s_lspoly_svd(np,x,y,deg,coeff,status) | |
| 1159 | 1282 | ! |
| 1160 | 1283 | ! Least square polynomial fitting |
| 1161 | 1284 | ! |