Краевые задачи. Методы решения А.Ю.Виноградова. Включая жесткие краевые задачиРефераты >> Математика >> Краевые задачи. Методы решения А.Ю.Виноградова. Включая жесткие краевые задачи
A_perem[7][5]=(-2.0-(2*nn2+1)/sin(angle_fi)/sin(angle_fi))/tan(angle_fi);
A_perem[7][6]=-1.0+(2*nn2+1)/sin(angle_fi)/sin(angle_fi);
A_perem[7][7]=-2.0/tan(angle_fi);
}
//Задание вектора внешних воздействий в системе ОДУ - вектора POWER: Y'(x)=A*Y(x)+POWER(x):
void power_vector_for_partial_vector(double x, double POWER[8]){
POWER[0]=0.0;
POWER[1]=0.0;
POWER[2]=0.0;
POWER[3]=0.0;
POWER[4]=0.0;
POWER[5]=0.0;
POWER[6]=0.0;
POWER[7]=0.0;
}
//Скалярное произведение векторов - i-й строки матрицы А и j-й строки матрицы С.
double mult(double A[8][8], int i, double C[8][8], int j){
double result=0.0;
for(int k=0;k<8;k++){
result+=A[i][k]*C[j][k];
}
return result;
}
//Вычисление нормы вектора, где вектор это i-я строка матрицы А.
double norma(double A[8][8], int i){
double norma_=0.0;
for(int k=0;k<8;k++){
norma_+=A[i][k]*A[i][k];
}
norma_=sqrt(norma_);
return norma_;
}
//Выполнение ортонормирования. Исходная система A*x=b размерности 8х8 приводиться к системе C*x=d, где строки матрицы С ортонормированы.
void orto_norm_8x8(double A[8][8], double b[8], double C[8][8], double d[8]){
double NORM;
double mult0,mult1,mult2,mult3,mult4,mult5,mult6,mult7;
//Получаем 1-ю строку уравнения C*x=d:
NORM=norma(A,0);
for(int k=0;k<8;k++){
C[0][k]=A[0][k]/NORM;
}
d[0]=b[0]/NORM;
//Получаем 2-ю строку уравнения C*x=d:
mult0=mult(A,1,C,0);
for(int k=0;k<8;k++){
C[1][k]=A[1][k]-mult0*C[0][k];
}
NORM=norma(C,1);
for(int k=0;k<8;k++){
C[1][k]/=NORM;
}
d[1]=(b[1]-mult0*d[0])/NORM;
//Получаем 3-ю строку уравнения C*x=d:
mult0=mult(A,2,C,0); mult1=mult(A,2,C,1);
for(int k=0;k<8;k++){
C[2][k]=A[2][k]-mult0*C[0][k]-mult1*C[1][k];
}
NORM=norma(C,2);
for(int k=0;k<8;k++){
C[2][k]/=NORM;
}
d[2]=(b[2]-mult0*d[0]-mult1*d[1])/NORM;
//Получаем 4-ю строку уравнения C*x=d:
mult0=mult(A,3,C,0); mult1=mult(A,3,C,1); mult2=mult(A,3,C,2);
for(int k=0;k<8;k++){
C[3][k]=A[3][k]-mult0*C[0][k]-mult1*C[1][k]-mult2*C[2][k];
}
NORM=norma(C,3);
for(int k=0;k<8;k++){
C[3][k]/=NORM;
}
d[3]=(b[3]-mult0*d[0]-mult1*d[1]-mult2*d[2])/NORM;
//Получаем 5-ю строку уравнения C*x=d:
mult0=mult(A,4,C,0); mult1=mult(A,4,C,1); mult2=mult(A,4,C,2); mult3=mult(A,4,C,3);
for(int k=0;k<8;k++){
C[4][k]=A[4][k]-mult0*C[0][k]-mult1*C[1][k]-mult2*C[2][k]-
mult3*C[3][k];
}
NORM=norma(C,4);
for(int k=0;k<8;k++){
C[4][k]/=NORM;
}
d[4]=(b[4]-mult0*d[0]-mult1*d[1]-mult2*d[2]-mult3*d[3])/NORM;
//Получаем 6-ю строку уравнения C*x=d:
mult0=mult(A,5,C,0); mult1=mult(A,5,C,1); mult2=mult(A,5,C,2); mult3=mult(A,5,C,3); mult4=mult(A,5,C,4);
for(int k=0;k<8;k++){
C[5][k]=A[5][k]-mult0*C[0][k]-mult1*C[1][k]-mult2*C[2][k]-
mult3*C[3][k]-mult4*C[4][k];
}
NORM=norma(C,5);
for(int k=0;k<8;k++){
C[5][k]/=NORM;
}
d[5]=(b[5]-mult0*d[0]-mult1*d[1]-mult2*d[2]-mult3*d[3]-mult4*d[4])/NORM;
//Получаем 7-ю строку уравнения C*x=d:
mult0=mult(A,6,C,0); mult1=mult(A,6,C,1); mult2=mult(A,6,C,2); mult3=mult(A,6,C,3); mult4=mult(A,6,C,4); mult5=mult(A,6,C,5);
for(int k=0;k<8;k++){
C[6][k]=A[6][k]-mult0*C[0][k]-mult1*C[1][k]-mult2*C[2][k]-
mult3*C[3][k]-mult4*C[4][k]-mult5*C[5][k];
}
NORM=norma(C,6);
for(int k=0;k<8;k++){
C[6][k]/=NORM;
}
d[6]=(b[6]-mult0*d[0]-mult1*d[1]-mult2*d[2]-mult3*d[3]-mult4*d[4]-
mult5*d[5])/NORM;
//Получаем 8-ю строку уравнения C*x=d:
mult0=mult(A,7,C,0); mult1=mult(A,7,C,1); mult2=mult(A,7,C,2); mult3=mult(A,7,C,3); mult4=mult(A,7,C,4); mult5=mult(A,7,C,5);
mult6=mult(A,7,C,6);
for(int k=0;k<8;k++){
C[7][k]=A[7][k]-mult0*C[0][k]-mult1*C[1][k]-mult2*C[2][k]-
mult3*C[3][k]-mult4*C[4][k]-mult5*C[5][k]-mult6*C[6][k];
}
NORM=norma(C,7);
for(int k=0;k<8;k++){
C[7][k]/=NORM;
}
d[7]=(b[7]-mult0*d[0]-mult1*d[1]-mult2*d[2]-mult3*d[3]-mult4*d[4]-
mult5*d[5]-mult6*d[6])/NORM;
}
//Выполнение ортонормирования системы A*x=b с прямоугольной матрицей A коэффициентов размерности 4х8.
void orto_norm_4x8(double A[4][8], double b[4], double C[4][8], double d[4]){
double NORM;
double mult0,mult1,mult2,mult3,mult4,mult5,mult6,mult7;
//Получаем 1-ю строку уравнения C*x=d:
NORM=norma(A,0);
for(int k=0;k<8;k++){
C[0][k]=A[0][k]/NORM;
}
d[0]=b[0]/NORM;
//Получаем 2-ю строку уравнения C*x=d:
mult0=mult(A,1,C,0);
for(int k=0;k<8;k++){
C[1][k]=A[1][k]-mult0*C[0][k];
}
NORM=norma(C,1);
for(int k=0;k<8;k++){
C[1][k]/=NORM;
}
d[1]=(b[1]-mult0*d[0])/NORM;
//Получаем 3-ю строку уравнения C*x=d:
mult0=mult(A,2,C,0); mult1=mult(A,2,C,1);
for(int k=0;k<8;k++){
C[2][k]=A[2][k]-mult0*C[0][k]-mult1*C[1][k];
}
NORM=norma(C,2);
for(int k=0;k<8;k++){
C[2][k]/=NORM;
}
d[2]=(b[2]-mult0*d[0]-mult1*d[1])/NORM;
//Получаем 4-ю строку уравнения C*x=d:
mult0=mult(A,3,C,0); mult1=mult(A,3,C,1); mult2=mult(A,3,C,2);
for(int k=0;k<8;k++){
C[3][k]=A[3][k]-mult0*C[0][k]-mult1*C[1][k]-mult2*C[2][k];
}
NORM=norma(C,3);
for(int k=0;k<8;k++){
C[3][k]/=NORM;
}
d[3]=(b[3]-mult0*d[0]-mult1*d[1]-mult2*d[2])/NORM;
}
//Произведение матрицы A1 размерности 4х8 на матрицу А2 размерности 8х8. Получаем матрицу rezult размерности 4х8:
void mat_4x8_on_mat_8x8(double A1[4][8], double A2[8][8], double rezult[4][8]){
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
rezult[i][j]=0.0;
for(int k=0;k<8;k++){
rezult[i][j]+=A1[i][k]*A2[k][j];
}
}
}
}
//Умножение матрицы A на вектор b и получаем rezult.
void mat_on_vect(double A[8][8], double b[8], double rezult[8]){
for(int i=0;i<8;i++){
rezult[i]=0.0;
for(int k=0;k<8;k++){
rezult[i]+=A[i][k]*b[k];
}
}
}
//Умножение матрицы A размерности 4х8 на вектор b размерности 8 и получаем rezult размерности 4.
void mat_4x8_on_vect_8(double A[4][8], double b[8], double rezult[4]){
for(int i=0;i<4;i++){
rezult[i]=0.0;
for(int k=0;k<8;k++){
rezult[i]+=A[i][k]*b[k];
}
}
}
//Вычитание из вектора u1 вектора u2 и получение вектора rez=u1-u2. Все вектора размерности 4.
void minus(double u1[4], double u2[4], double rez[4]){
for(int i=0;i<4;i++){
rez[i]=u1[i]-u2[i];
}
}
//Вычисление матричной экспоненты EXP=exp(A*delta_x)
void exponent(double A[8][8], double delta_x, double EXP[8][8]) {
//n - количество членов ряда в экспоненте, m - счетчик членов ряда (m<=n)
int n=100, m;