Краевые задачи. Методы решения А.Ю.Виноградова. Включая жесткие краевые задачиРефераты >> Математика >> Краевые задачи. Методы решения А.Ю.Виноградова. Включая жесткие краевые задачи
mat_on_vect(mat_row, POWER_, REZ);//Умножение матрицы mat_row на вектор POWER_ и получаем вектор REZ
mat_on_vect(expo_, REZ, REZ_2);//Умножение матрицы expo_ на вектор REZ и получаем вектор REZ_2
for(int i=0;i<8;i++){
vector[i]=REZ_2[i]*delta_x;
}
}
//Решение СЛАУ размерности 8 методом Гаусса с выделением главного элемента
int GAUSS(double AA[8][8], double bb[8], double x[8]){
double A[8][8];
double b[8];
for(int i=0;i<8;i++){
b[i]=bb[i];//Работать будем с вектором правых частей b, чтобы исходный вектор bb не изменялся при выходе из подпрограммы
for(int j=0;j<8;j++){
A[i][j]=AA[i][j];//Работать будем с матрицей А, чтобы исходная матрица АА не менялась при выходе из подпрограммы
}
}
int e;//номер строки, где обнаруживается главный (максимальный) коэффициент в столбце jj
double s, t, main;//Вспомогательная величина
for(int jj=0;jj<(8-1);jj++){//Цикл по столбцам jj преобразования матрицы А в верхнетреугольную
e=-1; s=0.0; main=A[jj][jj];
for(int i=jj;i<8;i++){//Находится номер е строки, где лежит главный (максимальный) элемент в столбце jj и делается взаимозамена строк
if ((A[i][jj]*A[i][jj])>s) {//Вместо перемножения (удаляется возможный знак минуса) можно было бы использовать функцию по модулю abs()
e=i; s=A[i][jj]*A[i][jj];
}
}
if (e<0) {
cout<<"Mistake "<<jj<<"\n"; return 0;
}
if (e>jj) {//Если главный элемент не в строке с номером jj. а в строке с номером е
main=A[e][jj];
for(int j=0;j<8;j++){//Взаимная замена двух строк - с номерами e и jj
t=A[jj][j]; A[jj][j]=A[e][j]; A[e][j]=t;
}
t=b[jj]; b[jj]=b[e]; b[e]=t;
}
for(int i=(jj+1);i<8;i++){//Приведение к верхнетреугольной матрице
for(int j=(jj+1);j<8;j++){
A[i][j]=A[i][j]-(1/main)*A[jj][j]*A[i][jj];//Перерасчет коэффициентов строки i>(jj+1)
}
b[i]=b[i]-(1/main)*b[jj]*A[i][jj];
A[i][jj]=0.0;//Обнуляемые элементы столбца под диагональным элементом матрицы А
}
}//Цикл по столбцам jj преобразования матрицы А в верхнетреугольную
x[8-1]=b[8-1]/A[8-1][8-1];//Первоначальное определение последнего элемента искомого решения х (7-го)
for(int i=(8-2);i>=0;i--){//Вычисление елементов решения x[i] от 6-го до 0-го
t=0;
for(int j=1;j<(8-i);j++){
t=t+A[i][i+j]*x[i+j];
}
x[i]=(1/A[i][i])*(b[i]-t);
}
return 0;
}
int main()
{
int nn;//Номер гармоники, начиная с 1-й (без нулевой)
int nn_last=50;//Номер последней гармоники
double Moment[100+1]={0};//Массив физического параметра (момента), что рассчитывается в каждой точке между краями
double step=0.02; //step=(L/R)/100 - величина шага расчета оболочки - шага интервала интегрирования (должна быть больше нуля, т.е. положительная)
double h_div_R;//Величина h/R
h_div_R=1.0/100;
double c2;
c2=h_div_R*h_div_R/12;//Величина h*h/R/R/12
double nju;
nju=0.3;
double gamma;
gamma=3.14159265359/4;//Угол распределения силы по левому краю
//распечатка в файлы:
FILE *fp;
// Open for write
if( (fp = fopen( "C:/test.txt", "w" )) == NULL ) // C4996
printf( "The file 'C:/test.txt' was not opened\n" );
else
printf( "The file 'C:/test.txt' was opened\n" );
for(nn=1;nn<=nn_last;nn++){ //ЦИКЛ ПО ГАРМОНИКАМ, НАЧИНАЯ С 1-ОЙ ГАРМОНИКИ (БЕЗ НУЛЕВОЙ ГАРМОНИКИ)
double x=0.0;//Координата от левого края - нужна для случая неоднородной системы ОДУ для вычисления частного вектора FF
double expo_from_minus_step[8][8]={0};//Матрица для расположения в ней экспоненты на шаге типа (0-x1)
double expo_from_plus_step[8][8]={0};//Матрица для расположения в ней экспоненты на шаге типа (x1-0)
double mat_row_for_minus_expo[8][8]={0};//вспомогательная матрица для расчета частного вектора при движении на шаге типа (0-x1)
double mat_row_for_plus_expo[8][8]={0};//вспомогательная матрица для расчета частного вектора при движении на шаге типа (x1-0)
double MATRIXS[100+1][8][8]={0};//Массив из матриц размерности 8x8 для решения СЛАУ в каждой точке интервала интегрирования
double VECTORS[100+1][8]={0};//Массив векторов правых частей размерности 8 соответствующих СЛАУ
double U[4][8]={0};//Матрица краевых условий левого края размерности 4х8
double u_[4]={0};//Вектор размерности 4 внешнего воздействия для краевых условий левого края
double V[4][8]={0};//Матрица краевых условий правого края размерности 4х8
double v_[4]={0};//Вектор размерности 4 внешнего воздействия для краевых условий правого края
double Y[100+1][8]={0};//Массив векторов-решений соответствующих СЛАУ (в каждой точке интервала между краями): MATRIXS*Y=VECTORS
double A[8][8]={0};//Матрица коэффициентов системы ОДУ
double FF[8]={0};//Вектор частного решения неоднородной ОДУ на участке интервала интегрирования
double Ui[4][8]={0};//Вспомогательная матрица коэффициентов переносимых краевых условий с левого края
double ui_[4]={0};//Правые части переносимых краевых условий с левого края
double ui_2[4]={0};//вспомогательный вектор (промежуточный)
double UiORTO[4][8]={0};//Ортонормированная переносимая матрица с левого края
double ui_ORTO[4]={0};//Соответственно правые части ортонормированного переносимого уравнения с левого края
double Vj[4][8]={0};//Вспомогательная матрица коэффициентов переносимых краевых условий с правого края
double vj_[4]={0};//Правые части переносимых краевых условий с правого края
double vj_2[4]={0};//Вспомогательный вектор (промежуточный)
double VjORTO[4][8]={0};//Ортонормированная переносимая матрица с правого края
double vj_ORTO[4]={0};//Соответственно правые части ортонормированного переносимого уравнения с правого края
double MATRIX_2[8][8]={0};//Вспомогательная матрица
double VECTOR_2[8]={0};//Вспомогательный вектор
double Y_2[8]={0};//Вспомогательный вектор
double nn2,nn3,nn4,nn5,nn6,nn7,nn8;//Возведенный в соответствующие степени номер гармоники nn
nn2=nn*nn; nn3=nn2*nn; nn4=nn2*nn2; nn5=nn4*nn; nn6=nn4*nn2; nn7=nn6*nn; nn8=nn4*nn4;
//Заполнение ненулевых элементов матрицы А коэффициентов системы ОДУ
A[0][1]=1.0;
A[1][0]=(1-nju)/2*nn2; A[1][3]=-(1+nju)/2*nn; A[1][5]=-nju;
A[2][3]=1.0;
A[3][1]=(1+nju)/(1-nju)*nn; A[3][2]=2*nn2/(1-nju); A[3][4]=2*nn/(1-nju);
A[4][5]=1.0;
A[5][6]=1.0;
A[6][7]=1.0;
A[7][1]=-nju/c2; A[7][2]=-nn/c2; A[7][4]=-(nn4+1/c2); A[7][6]=2*nn2;
//Здесь надо первоначально заполнить ненулевыми значениями матрицы и вектора краевых условий U*Y[0]=u_ (слева) и V*Y[100]=v_ (справа) :
U[0][1]=1.0; U[0][2]=nn*nju; U[0][4]=nju; u_[0]=0.0;//Сила T1 на левом крае равна нулю
U[1][0]=-(1-nju)/2*nn; U[1][3]=(1-nju)/2; U[1][5]=(1-nju)*nn*c2; u_[1]=0.0;//Сила S* на левом краю равна нулю