Реферат: Программа (код) на С++ решения жесткой краевой задачи методом А.Ю.Виноградова

06 сентября 2011 (расчет ЦИЛИНДРИЧЕСКОЙ ОБОЛОЧКИ)

Алексей Юрьевич Виноградов

Кандидат физико-математических наук (1996 года защиты)

Дата рождения: 12 апреля 1970 (а то в интернете много моих полных тезок)

/>

Мои сайты по методам решения краевых задач в интернете:

www.AlexeiVinogradov.narod.ru  www.VinogradovAlexei.narod.ru

www.Vinogradov-Alexei.narod.ru  www.Vinogradov-Math.narod.ru

 

СОДЕРЖАНИЕ:

Программа (код) на С++, написанная в среде MSVisualStudio 2010 (VisualC++), – программа решения «жесткой» краевой задачи для системы обыкновенных дифференциальных уравнений с ПОСТОЯННЫМИ коэффициентами – ЦИЛИНДР. Страницы 2 – 12.Теория метода Алексея Юрьевича Виноградова «переноса краевых условий» для краевых задач, включая «жесткие» краевые задачи, для реализации которого написана приводимая программа. Страницы 12 — 26.

 

 

 

 

 

 

 

 

 

 

//from_A_Yu_Vinogradov.cpp: главный файл проекта.

//Решение краевой задачи — цилиндрической оболочки.

//Интервал интегрирования разбит на 100 участков: левый край — точка 0 и правый край — точка 100

 

#include«stdafx.h»

#include

#include<conio.h>

 

usingnamespace std;

 

//Скалярное произведение векторов — i-й строки матрицы А и j-й строки матрицы С.

doublemult(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-я строка матрицы А.

doublenorma(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, где строки матрицы С ортонормированы.

voidorto_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.

voidorto_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:

voidmat_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.

voidmat_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.

voidmat_4x8_on_vect_8(double A[4][8], double b[8], double rezult[4]){</p