|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Dmitry Pankov 2:5022/81 23 Dec 2001 17:03:42 To : Dmitry Sergeev Subject : кубический сплайн ? -------------------------------------------------------------------------------- 23 декабря 2001 года (а было тогда 14:30) Dmitry Sergeev в своем письме к All писал: DS> Hужно сделать прогу "интерполирование функции кубическим сплайном". DS> Может кто делал и сможет пообщаться со мной по этой теме ? ======== Hачало interpol.cpp ======== #include <iostream.h> #include <stdlib.h> #include <math.h> #define MS 30 typedef double Matrix[MS][MS+1]; typedef double Vector[MS]; //**************************************************************************** // Решение СЛАУ методом прогонки // Вход: // A - поддиагональ // B - главная диагональ // C - наддиагональ // D - столбец свободных членов // n - число уравнений // Выход: // X - вектор решений void Progon(Vector A, Vector B, Vector C, Vector D, Vector X, int n) { int i; Vector U,V; // прогоночные коэффициенты U[0]=D[0]/B[0]; V[0]=-C[0]/B[0]; for(i=1; i<=n-2; i++) { U[i]=(D[i]-A[i]*U[i-1])/(A[i]*V[i-1]+B[i]); V[i]=-C[i]/(A[i]*V[i-1]+B[i]); } U[n-1]=X[n-1]=(D[n-1]-A[n-1]*U[n-2])/(A[n-1]*V[n-2]+B[n-1]); V[n-1]=0; // обратный ход for(i=n-2; i>=0; i--) X[i]=U[i]+V[i]*X[i+1]; } //**************************************************************************** // Интерполяционный кубический сплайн // X - вектор абсцисс // Y - вектор ординад // n - число узлов // Выход: // S - матрица коэффициентов при степенях сплайна void CSpline(Vector X, Vector Y, int n, Matrix S) { Vector h={0}, B={0}, C={0}, D={0}, Alf={0}, Bet={0}, Gam={0}, Fi={0}; int i; // составление трехдиагональной СЛАУ for(i=1; i<n; i++) h[i]=X[i]-X[i-1]; for(i=2; i<n-1; i++) Alf[i]=h[i]; for(i=1; i<n-1; i++) Bet[i]=2*(h[i]+h[i+1]); for(i=1; i<n-2; i++) Gam[i]=h[i+1]; for(i=1; i<n-1; i++) Fi[i]=6*((Y[i+1]-Y[i])/h[i+1]-(Y[i]-Y[i-1])/h[i]); // решение СЛАУ методом прогонки Progon(Alf,Bet,Gam,Fi,C,n); for(i=1; i<n; i++) { // вычисление коэффициентов сплайна D[i]=(C[i]-C[i-1])/h[i]; B[i]=h[i]/2*C[i]-h[i]*h[i]/6*D[i]+(Y[i]-Y[i-1])/h[i]; // вычисление коэффициентов при степенях S[i-1][0]=Y[i]-B[i]*X[i]+C[i]*pow(X[i],2)/2-D[i]*pow(X[i],3)/6; S[i-1][1]=B[i]-C[i]*X[i]+D[i]*pow(X[i],2)/2; S[i-1][2]=C[i]/2-D[i]*X[i]/2; S[i-1][3]=D[i]/6; } } //**************************************************************************** void main() { Vector X={-1,0,1,2}, Y={0,1,1,1}, C; Matrix CS,LS; int i,j,n=4; Vector X1={-2,-1,0,1,2,3}, Y1={1,0,1,1,1,1}; n=6; int m=2; CSpline(X1,Y1,n,CS); for(i=0; i<n-1; i++) { cout << i << " CSpline:" << endl; for(j=0; j<=3; j++) cout << " S[" << i << "][" << j << "]=" << CS[i][j] << endl; } } ======== Конец interpol.cpp ======== С наилучшими пожеланиями, Dmitry *e-mail: panda@tula.net* . Тишина ... Любовь - это полет, а чтобы летать нyжно два кpыла --- Win95 UpTime: 00d 22h 31m 01s * Origin: Жизнь - игра, в которой нет setup'а (2:5022/81) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/18243c2600e1.html, оценка из 5, голосов 10
|