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

  • Просмотров 7538
  • Скачиваний 551
  • Размер файла 277
    Кб

             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;        double E[8][8]={0}, TMP1[8][8], TMP2[8][8];        int

i,j,k;          //E - единичная матрица - первый член ряда экспоненты        E[0][0]=1.0; E[1][1]=1.0; E[2][2]=1.0; E[3][3]=1.0;        E[4][4]=1.0; E[5][5]=1.0; E[6][6]=1.0; E[7][7]=1.0;          //первоначальное заполнение вспомогательного массива TMP1 - предыдущего члена ряда для следующего перемножения        //и первоначальное заполнение экспоненты первым членом ряда        for(i=0;i<8;i++) {