@@ -46,4 +46,106 @@ double** divideNewton(vector<double> xn, vector<double> fx){
46
46
}
47
47
}
48
48
return f;
49
+ }
50
+
51
+ double ** Hermite (vector<double > xn, vector<double > fx,vector<double > fxx){
52
+ int size = xn.size ();
53
+ double **q = new double *[2 *size+1 ];
54
+ double *zn = new double [2 * size + 1 ];
55
+ for (int i = 0 ; i < 2 *size+1 ; i++){
56
+ q[i] = new double [2 *size+1 ];
57
+ }
58
+
59
+
60
+ for (int i = 0 ; i < size; i++){
61
+ zn[2 *i] = xn[i];
62
+ zn[2 *i + 1 ] = xn[i];
63
+ q[2 * i][0 ] = fx[i];
64
+ q[2 * i + 1 ][0 ] = fx[i];
65
+ q[2 * i + 1 ][1 ] = fxx[i];
66
+ if (i != 0 ){
67
+ q[2 * i][1 ] = (q[2 * i][0 ] - q[2 * i - 1 ][0 ]) / (zn[2 * i] - zn[2 * i - 1 ]);
68
+ }
69
+ }
70
+
71
+ for (int i = 2 ; i < 2 * size + 1 ; i++){
72
+ for (int j = 2 ; j <= i; j++){
73
+ q[i][j] = (q[i][j-1 ] - q[i - 1 ][j-1 ]) / (zn[i] - zn[i - j]);
74
+ }
75
+ }
76
+
77
+ return q;
78
+
79
+ }
80
+
81
+
82
+ double ** CubicSpline (vector<double > xn, vector<double > fx){
83
+ int size = xn.size ();
84
+ double **p = new double *[size];
85
+ for (int i = 0 ; i < size; i++){
86
+ p[i] = new double [4 ];
87
+ }
88
+ // 复制fx到p[][0]
89
+ for (int i = 0 ; i < fx.size (); i++){
90
+ p[i][0 ] = fx[i];
91
+ }
92
+ double *h = new double [size];
93
+ double *l = new double [size];
94
+ double *u = new double [size];
95
+ double *z = new double [size];
96
+ for (int i = 0 ; i < size - 1 ; i++){
97
+ h[i] = xn[i + 1 ] - xn[i];
98
+ }
99
+
100
+ for (int i = 1 ; i < size - 1 ; i++){
101
+ fx[i] = 3 / h[i] * (fx[i + 1 ] - fx[i]) - 3 / h[i - 1 ] * (fx[i] - fx[i - 1 ]);
102
+ }
103
+
104
+ l[0 ] = 1 ;
105
+ u[0 ] = 0 ;
106
+ z[0 ] = 0 ;
107
+
108
+ for (int i = 1 ; i < size - 1 ; i++){
109
+ l[i] = 2 * (xn[i + 1 ] - xn[i - 1 ]) - h[i - 1 ] * u[i - 1 ];
110
+ u[i] = h[i] / l[i];
111
+ z[i] = (fx[i] - h[i - 1 ] * z[i - 1 ]) / l[i];
112
+ }
113
+
114
+ l[size - 1 ] = 1 ;
115
+ z[size - 1 ] = 0 ;
116
+ p[size - 1 ][2 ] = 0 ;
117
+
118
+ for (int j = size - 2 ; j >= 0 ; j--){
119
+ p[j][2 ] = z[j] - u[j] * p[j+1 ][2 ];
120
+ p[j][1 ] = (fx[j + 1 ] - fx[j]) / h[j] - h[j] * (p[j + 1 ][2 ] + 2 * p[j][2 ]) / 3 ;
121
+ p[j][3 ] = (p[j + 1 ][2 ] - p[j][2 ]) / (3 * h[j]);
122
+ }
123
+
124
+ return p;
125
+
126
+ }
127
+
128
+ void testCubicSpline (){
129
+
130
+ vector<double > xn;
131
+ vector<double > fx;
132
+ xn.push_back (0.9 );
133
+ fx.push_back (1.3 );
134
+ xn.push_back (1.3 );
135
+ fx.push_back (1.5 );
136
+ xn.push_back (1.9 );
137
+ fx.push_back (1.85 );
138
+ xn.push_back (2.1 );
139
+ fx.push_back (2.1 );
140
+
141
+ double **p=CubicSpline (xn, fx);
142
+ for (int i = 0 ; i < xn.size ()-1 ; i++){
143
+ cout << " -------------------" << endl;
144
+ cout << " a:" << p[i][0 ] << endl;
145
+ cout << " b:" << p[i][1 ] << endl;
146
+ cout << " c:" << p[i][2 ] << endl;
147
+ cout << " d:" << p[i][3 ] << endl;
148
+ cout << " ----------------------" << endl;
149
+ }
150
+
49
151
}
0 commit comments