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 Y_many[8*11]={0};// составной вектор из векторов Y(xi) в 11-ти точках с точки 0 (левый край Y(0)) до точки 10 (правый край Y(x10))
double MATRIX_many[8*11][8*11]={0};//матрица СЛАУ
double B_many[8*11]={0};// вектор правых частей СЛАУ: MATRIX_many*Y_many=B_many
double Y_vspom[8]={0};//вспомогательный вектор
double Y_rezult[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* на левом краю равна нулю
U[2][4]=-nju*nn2; U[2][6]=1.0; u_[2]=0;//Момент M1 на левом краю равен нулю
U[3][5]=(2-nju)*nn2; 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_
exponent(A, (-step*10), expo_from_minus_step);//Шаг отрицательный (значение шага меньше нуля из-за направления вычисления матричной экспоненты)
//x=0.0;//начальное значение координаты - для расчета частного вектора
//mat_row_for_partial_vector(A, step, mat_row_for_minus_expo);
//Заполнение матрицы коэффициентов СЛАУ MATRIX_many
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
MATRIX_many[i][j]=U[i][j];
MATRIX_many[8*11-4+i][8*11-8+j]=V[i][j];
}
B_many[i]=u_[i];
B_many[8*11-4+i]=v_[i];
}
for(int kk=0;kk<(11-1);kk++){//(11-1) единичных матриц и матриц EXPO надо записать в MATRIX_many
for(int i=0;i<8;i++){
MATRIX_many[i+4+kk*8][i+kk*8]=1.0;//заполнение единичными матрицами
for(int j=0;j<8;j++){
MATRIX_many[i+4+kk*8][j+8+kk*8]=-expo_from_minus_step[i][j];//заполнение матричными экспонентами
}
}
}
//Решение систем линейных алгебраических уравнений
GAUSS(MATRIX_many, B_many, Y_many);
//Вычисление векторов состояния в 101 точке - левая точка 0 и правая точка 100
exponent(A, step, expo_from_plus_step);
for(int i=0;i<11;i++){//заполнение промежуточных точек во всех 10-ти интервалах (всего получим точки от 0 до 100) между 11 узлами
for(int j=0;j<8;j++){
Y[0+i*10][j]=Y_many[j+i*8];//в 11-ти узлах векторы беруться из решения СЛАУ - из Y_many
}
}
for(int i=0;i<10;i++){//заполнение промежуточных точек в 10-ти интервалах
for(int j=0;j<8;j++){
Y_vspom[j]=Y[0+i*10][j];//начальный вектор для i-го участка, нулевая точка, точка старта i-го участка
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+1][j]=Y_rezult[j];//заполнение 1-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+2][j]=Y_rezult[j];//заполнение 2-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+3][j]=Y_rezult[j];//заполнение 3-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+4][j]=Y_rezult[j];//заполнение 4-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+5][j]=Y_rezult[j];//заполнение 5-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+6][j]=Y_rezult[j];//заполнение 6-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+7][j]=Y_rezult[j];//заполнение 7-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+8][j]=Y_rezult[j];//заполнение 8-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
mat_on_vect(expo_from_plus_step, Y_vspom, Y_rezult);
for(int j=0;j<8;j++){
Y[0+i*10+9][j]=Y_rezult[j];//заполнение 9-ой точки интервала
Y_vspom[j]=Y_rezult[j];//для следующего шага
}
}
//Вычисление момента во всех точках между краями
for(int ii=0;ii<=100;ii++){
Moment[ii]+=Y[ii][4]*(-nju*nn2)+Y[ii][6]*1.0;//Момент M1 в точке [ii]
//U[2][4]=-nju*nn2; U[2][6]=1.0; u_[2]=0;//Момент M1
}
}//ЦИКЛ ПО ГАРМОНИКАМ ЗДЕСЬ ЗАКАНЧИВАЕТСЯ
for(int ii=0;ii<=100;ii++){
fprintf(fp, "%f\n", Moment[ii]);
}
fclose(fp);
printf( "PRESS any key to continue...\n" );
_getch();
return 0;
}
Алексей Юрьевич Виноградов
Кандидат физико-математических наук (1996 года защиты)
Дата рождения: 12 апреля 1970 (а то в интернете много моих полных тезок)
Мои сайты по методам решения краевых задач в интернете:
www.AlexeiVinogradov.narod.ru www.VinogradovAlexei.narod.ru
www.Vinogradov-Alexei.narod.ru www.Vinogradov-Math.narod.ru