Краевые задачи. Методы решения А.Ю.Виноградова. Включая жесткие краевые задачиРефераты >> Математика >> Краевые задачи. Методы решения А.Ю.Виноградова. Включая жесткие краевые задачи
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 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;
//Здесь надо первоначально заполнить ненулевыми значениями матрицы и вектора краевых условий U*Y[0]=u_ (слева) и V*Y[100]=v_ (справа) :
U[0][0]=nju/tan(start_angle);
U[0][1]=1.0;
U[0][2]=nju*nn/sin(start_angle);
U[0][4]=(1+nju);
u_[0]=0.0;//Сила T1 на левом крае равна нулю
U[1][0]=-(1-nju)/2/sin(start_angle);
U[1][2]=-(1-nju)/2/tan(start_angle);
U[1][3]=(1-nju)/2;
U[1][4]=-c2*nn*(1-nju)/sin(start_angle)/tan(start_angle);
U[1][5]=c2*nn*(1-nju)/sin(start_angle);
u_[1]=0.0;//Сила S* на левом краю равна нулю
U[2][4]=-nju*nn2/sin(start_angle)/sin(start_angle);
U[2][5]=nju/tan(start_angle);
U[2][6]=1.0;
u_[2]=0;//Момент M1 на левом краю равен нулю
U[3][4]=-(3-nju)*nn2/sin(start_angle)/sin(start_angle)/tan(start_angle);
U[3][5]=nju+1.0/tan(start_angle)/tan(start_angle)-(nju-2)*nn2/sin(start_angle)/sin(start_angle);
U[3][6]=-1.0/tan(start_angle);
U[3][7]=-1.0;
u_[3]=-sin(nn*gamma)/(nn*gamma);//Сила Q1* на левом крае распределена на угол -gamma +gamma
V[0][0]=1.0; v_[0]=0.0;//Перемещение u на правом крае равно нулю
V[1][2]=1.0; v_[1]=0.0;//Перемещение v на правом крае равно нулю
V[2][4]=1.0; v_[2]=0.0;//Перемещение w на правом крае равно нулю
V[3][5]=1.0; v_[3]=0.0;//Угол поворота на правом крае равен нулю
//Здесь заканчивается первоначальное заполнение U*Y[0]=u_ и V*Y[100]=v_
orto_norm_4x8(U, u_, UiORTO, ui_ORTO);//Первоначальное ортонормирование краевых условий
orto_norm_4x8(V, v_, VjORTO, vj_ORTO);
//Первоначальное заполнение MATRIXS и VECTORS матричными уравнениями краевых условий соответственно
//UiORTO*Y[0]=ui_ORTO и VjORTO*Y[100]=vj_ORTO:
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
MATRIXS[0][i][j]=UiORTO[i][j];//Левый край; верхнее матричное уравнение
MATRIXS[100][i+4][j]=VjORTO[i][j];//Правый край (точка номер 101 с индексом 100 - отсчет идет с нуля); нижнее матричное уравнение
}
VECTORS[0][i]=ui_ORTO[i];//Левый край; верхнее матричное уравнение
VECTORS[100][i+4]=vj_ORTO[i];//Правый край (точка номер 101 с индексом 100 - отсчет идет с нуля); нижнее матричное уравнение
}
//Цикл по точкам ii интервала интегрирования заполнения ВЕРХНИХ частей матричных уравнений MATRIXS[ii]*Y[ii]=VECTORS[ii],
//начиная со второй точки - точки с индексом ii=1
angle=start_angle;//начальное значение угловой координаты
for(int ii=1;ii<=100;ii++){
angle+=step;//Угловая координата
A_perem_coef(nju, c2, nn, angle, A);//Вычисление матрицы А коэффициентов системы ОДУ при данной угловой координате angle
exponent(A,(-step),expo_from_minus_step);//Шаг отрицательный (значение шага меньше нуля из-за направления вычисления матричной экспоненты)
mat_row_for_partial_vector(A, step, mat_row_for_minus_expo);
mat_4x8_on_mat_8x8(UiORTO,expo_from_minus_step,Ui);//Вычисление матрицы Ui=UiORTO*expo_from_minus_step
//partial_vector(FF);//Вычисление НУЛЕВОГО вектора частного решения системы ОДУ на шаге
partial_vector_real(expo_from_minus_step, mat_row_for_minus_expo, angle, (-step),FF);// - для движения слева на право
mat_4x8_on_vect_8(UiORTO,FF,ui_2);//Вычисление вектора ui_2=UiORTO*FF
minus(ui_ORTO, ui_2, ui_);//Вычисление вектора ui_=ui_ORTO-ui_2
orto_norm_4x8(Ui, ui_, UiORTO, ui_ORTO);//Ортонормирование для текущего шага по ii
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
MATRIXS[ii][i][j]=UiORTO[i][j];
}
VECTORS[ii][i]=ui_ORTO[i];
}
}//Цикл по шагам ii (ВЕРХНЕЕ заполнение)
//Цикл по точкам ii интервала интегрирования заполнения НИЖНИХ частей матричных уравнений MATRIXS[ii]*Y[ii]=VECTORS[ii],
//начиная с предпоследней точки - точки с индексом ii=(100-1) используем ii-- (уменьшение индекса точки)
angle=finish_angle;//Угловая координата правого края
for(int ii=(100-1);ii>=0;ii--){
angle-=step;//Движение справа на лево
A_perem_coef(nju, c2, nn, angle, A);//Вычисление матрицы А коэффициентов системы ОДУ при данной угловой координате angle
exponent(A,step,expo_from_plus_step);//Шаг положительный (значение шага больше нуля из-за направления вычисления матричной экспоненты)