При численном решении этой задачи методом конечных разностей отрезок [a,b] разбивают на равные части с шагом h точками x i , где h=(b−a)/n.
Заменяя производные правыми односторонними конечно — разностными отношениями для внутренних точек x i и концевых точек отрезка [a,b], и выполняя алгебраические преобразования, получим систему линейных алгебраических уравнений
Реализовать решение на C++ можно следующим образом:
//============================================================================
// Name : mkr.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description :
//============================================================================
#include <iostream>
#include <cmath>
using namespace std;
double p(double x){
return exp(x);
}
double q(double x){
return 2*x;
}
double f(double x){
return pow(x,3);
}
void gauss(double** A, double* B, double* X, int n);
int main() {
double alpha0=2; double alpha1=-2.5; double Ac=0;
double beta0=3; double beta1=-3.4; double Bc=5;
double a0=0.1; double b0=1.3;
int n=4;
//matrix A[n+1][n+1]
double **A = new double*[n+1];
for(int i=0; i<n+1; i++){
A[i]=new double[n+1];
}
//===
double *B = new double[n+1]; //vector B[n+1]
double *X = new double[n+1]; //vector X[n+1]
//Grid
double h=(b0-a0)/n;
for(int i=0; i<=n; i++){
X[i]=a0+i*h;
//cout << X[i] << endl;
}
//===
cout << "h=" << h << endl;
//calculate matrix A, B
for(int i=0; i<=n-2; i++){
A[i][i]=h*h*q(X[i])-h*p(X[i])+1;
A[i][i+1]=h*p(X[i])-2;
A[i][i+2]=1;
B[i]=h*h*f(X[i]);
}
A[n-1][0]=alpha0*h-alpha1;
A[n-1][1]=alpha1;
A[n][n-1]=-beta1;
A[n][n]=beta0*h+beta1;
B[n-1]=h*Ac;
B[n]=h*Bc;
//===
//print A
for(int i=0; i<=n; i++){
for(int j=0; j<=n; j++){
cout << "A["<<i<<"]"<<"["<<j<<"]="<<A[i][j] <<" ";
}
cout << endl;
}
//===
cout << endl;
//print B
for(int i=0; i<=n; i++){
cout << "B["<<i<<"]="<<B[i] <<" ";
}
cout << endl;
cout << endl;
//===
//solve A*X1=B
double *X1 = new double[n+1]; //vector X1[n+1]
gauss(A,B,X1,n+1); //solve
//print X1
for(int i=0; i<=n; i++){
cout << "X1[" << i << "]=" << X1[i] << " ";
}
//===
return 0;
}
void gauss(double** A, double* B, double* X, int n){
int m=n+1;
//create C[n][n+1]
double **C = new double*[n];
for(int i=0; i<n; i++){
C[i]=new double[n+1];
}
//===
//split A and B to C
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
C[i][j]=A[i][j];
}
C[i][n]=B[i];
}
//===
/*
//print C
for(int i=0;i<n;i++){
for(int j=0;j<n+1;j++){
cout << C[i][j] << " ";
}
cout << endl;
}
//===
*/
//forward
for (int k=0; k<n-1; k++){
for (int i=k+1;i<n;i++){
for (int j=m-1; j>=k; j--){
C[i][j]=C[i][j]-C[i][k]*C[k][j]/C[k][k];
}
}
}
//reverse
X[n-1]=A[n-1][m-2]/A[n-1][m-2];
for (int i=n-2; i>=0; i--){
double s=0;
for (int j=i+1;j<m-1;j++){
s=s+C[i][j]*X[j];
}
X[i]=(C[i][m-1] - s)/C[i][i];
}
}