#include "RBFInterp.hpp" #include "interp.hpp" #include "gnuplot.hpp" #include #include #include #include #include #include #include "time_mes.hpp" using namespace std; // Fonction à interpoler z= f(x,y) float finit(int x,int y) { return 1.0+float(x*sin(float(x)/1000.)+2*y)/1000.; } int main() { typedef float real; // voir RBFInterp qui définit ceci: typedef typename RBFInterp>::PointValue PointValue; // qui est une map (i,j) -> valeur flottante. // taille de l'"image": int nx=1500,ny=1500; cout<<"nx : "<(nx*vrand); vrand=float(std::rand())/RAND_MAX; int yy= static_cast(ny*vrand); auto k=make_pair(xx,yy); // valeur de l'image en ce point. Values[k]=finit(xx,yy); if(xx<0 || xx>=nx||yy<0 || yy>=ny) // vérifier que les points sont dans l'image. throw "pas bien"; } cout<<"nb. values : "<first]= I->second; else // les points de test. Test[I->first]= I->second; } cout<<"estimation d'epsilon. nb. noeuds : "< typRad; //typedef TPS typRad; //typedef TPSD typRad; //typedef Gauss typRad; real eps= 0.01; //valeur de départ de eps RBFInterp A(eps); // // Les points d'interpolation : gnuplotfile(Values,"points"); //--1--- Détermination d'un epsilon "optimal" pour les RBF. ofstream f; f.open("eps-err");//pour faire un graphique precision(epsilon) start=get_time(); real epsm= eps; real testm=1.e10; for(int iter=1;iter<=25;iter++) { eps/= 10.; A.set_epsilon(eps); bool calcond=false; // on calcule ou non le conditionnement (pas // nécessaire, mais peut donner un renseignement //utile). try{ A.build(NoTest,calcond); } catch(const LapackException& e ) { // normalement quand epsilon est trop petit, le système // linéaire devient singulier. On va donc à priori venir ici // plutôt que de sortir normalement de la boucle. eps*=10; break; } auto test= A.test(NoTest,Test); cout<<"eps : "<>aa; if(aa=="g") { cout<<"gnuplot files :"<