00001 #include "GCubic_Spline_Interpolation.h"
00002 #include <iostream>
00003
00004 using namespace GMathLib;
00005
00006 GCubic_Spline_Interpolation::GCubic_Spline_Interpolation()
00007 : GObject(), p_cfData(0), p_at(0), p_u(0), p_v(0), p_h(0)
00008 {
00009 Class_Name("GCubic_Spline_Interpolation");
00010 }
00011
00012 GCubic_Spline_Interpolation::~GCubic_Spline_Interpolation()
00013 {
00014 if(p_cfData != 0){
00015 delete[] p_cfData;
00016 delete p_at;
00017 delete p_h;
00018 delete p_u;
00019 delete p_v;
00020 }
00021 }
00022
00023 void GCubic_Spline_Interpolation::Prepair(int gridp_num)
00024 {
00025 if(p_cfData != 0){
00026 delete[] p_cfData;
00027 delete p_at;
00028 delete p_h;
00029 delete p_u;
00030 delete p_v;
00031 }
00032
00033
00034 p_cfData = new GCubicFncData[gridp_num-1];
00035 p_at = new GMatrix(gridp_num, gridp_num);
00036 p_u = new GVector(gridp_num, GVector::COLUMN_VECTOR);
00037 p_v = new GVector(gridp_num, GVector::COLUMN_VECTOR);
00038 p_h = new GVector(gridp_num-1, GVector::COLUMN_VECTOR);
00039 }
00040
00041 int GCubic_Spline_Interpolation::DoInterpolation(GMatrix& dc_mx)
00042 {
00043
00044 int d_size;
00045
00046 if(p_cfData == 0){
00047 std::cout << "Failed to Interpolation. Call Prepair() before calling DoInterpolation()!!" << std::endl;
00048
00049 return 1;
00050 }
00051
00052 if(dc_mx.Column() != 2 || dc_mx.Row() != p_at->Row()){
00053 std::cout << "Failed to Interpolation. Invalid matrix size" << std::endl;
00054 return 1;
00055 }
00056
00057
00058 d_size = p_at->Column();
00059
00060
00061 for(int i=0; i < d_size-1; i++){
00062 p_h->Set(i, dc_mx(i+1, 0) - dc_mx(i, 0));
00063 }
00064
00066
00067
00068
00069 p_at->Fill(0);
00070 p_at->Set(0, 0, 1.0);
00071 p_at->Set(d_size-1, d_size-1, 1.0);
00072
00073 for(int i=1; i < d_size-1; i++){
00074 p_at->Set(i, i-1, (*p_h)(i-1));
00075 p_at->Set(i, i, 2.0 * ( (*p_h)(i-1) + (*p_h)(i)) );
00076 p_at->Set(i, i+1, (*p_h)(i));
00077 }
00078
00079
00080
00081
00082 p_v->Set(0, 0);
00083 p_v->Set(d_size-1, 0);
00084
00085 double tmp = 0.0;
00086 for(int i=1; i < d_size-1; i++){
00087 tmp = 3.0 *
00088 (
00089 ( dc_mx(i+1, 1) - dc_mx(i, 1)) / (*p_h)(i) - ( dc_mx(i, 1) - dc_mx(i-1, 1)) / (*p_h)(i-1)
00090 );
00091 p_v->Set(i, tmp);
00092 }
00093
00094
00095
00096
00097 ln_hm_solver.S_Gauss_Partial_Pivot(*p_at, *p_v, *p_u);
00098
00099
00100
00101
00102 for(int i=0; i < d_size-1; i++){
00103 (p_cfData + i)->a = ( (*p_u)(i+1) - (*p_u)(i) ) / ( 3.0 * (*p_h)(i));
00104 (p_cfData + i)->b = (*p_u)(i);
00105 (p_cfData + i)->c = ( dc_mx(i+1, 1) - dc_mx(i,1) ) / (*p_h)(i)
00106 -
00107 (*p_h)(i) * ( 2.0 * (*p_u)(i) + (*p_u)(i+1) ) / 3.0;
00108
00109 (p_cfData + i)->d = dc_mx(i, 1);
00110 }
00111
00112 return 0;
00113 }
00114