Я пытаюсь добавить векторы в для l oop, но после 2 итераций я получаю неправильный ответ (C) - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь реализовать итерационную формулу Xn + 1 = T * Xn + C для заданного числа итераций i. Здесь X и C - векторы, а T - матрица 3x3. Однако, если I go превышает 2 итерации (fori = 0; i <2; i ++), формула начинает давать неверный результат, и я не уверен, почему. Любая помощь приветствуется. </p>

#include <stdio.h>
int main(void) {
  double T[3][3] = {{0.0,-0.5,-0.75},
                   {0.6,0.0,0.4},
                   {0.25,-0.375,0.0}};

  double C[3] = {2.0,2.8,3.375};
  double x_n[3] = {0.0,0.0,0.0};
  double x_n_plus_1[3] = {0.0,0.0,0.0};
  double Tx[3] = {0.0,0.0,0.0};
  int i, row, col, ctr;
  for(i=0;i<3;i++) {
    for(row=0;row<3;row++) {
      for(col=0;col<3;col++){
        Tx[row] += T[row][col] * x_n[col]; //Tx_n = T*x_n
      }
    }
    for(ctr=0;ctr<3;ctr++) {
      x_n_plus_1[ctr] = Tx[ctr] + C[ctr];//x_n+1 = Tx_n + C
    }
    for(ctr=0;ctr<3;ctr++) {
      x_n[ctr] = x_n_plus_1[ctr];
    }
  }
  for(ctr=0;ctr<3;ctr++) {
    printf("%lf\n",x_n[ctr]);
  }
  return 0;
}

1 Ответ

1 голос
/ 31 марта 2020

Как предложено pmg: «Вам нужно сбросить элементы Tx на ноль в начале (или конце) каждого il oop». Для каждой итерации i вам необходимо повторно инициализировать Tx. Если вы go превышаете 2 итерации (fori = 0; i <2; i ++), формула начинает давать неверный результат, поскольку, начиная со второй итерации, Tx по-прежнему не равно {0, 0, 0} </p>

#include <stdio.h>
int main(void) {
  double T[3][3] = {{0.0,-0.5,-0.75},
                   {0.6,0.0,0.4},
                   {0.25,-0.375,0.0}};

  double C[3] = {2.0,2.8,3.375};
  double x_n[3] = {0.0,0.0,0.0};
  double x_n_plus_1[3] = {0.0,0.0,0.0};

  int i, row, col, ctr;
  for(i=0;i<3;i++) {
    double Tx[3] = {0.0, 0.0, 0.0};
    for(row=0;row<3;row++) {
      for(col=0;col<3;col++){
        Tx[row] += T[row][col] * x_n[col]; //Tx_n = T*x_n
      }
    }
    for(ctr=0;ctr<3;ctr++) {
      x_n_plus_1[ctr] = Tx[ctr] + C[ctr];//x_n+1 = Tx_n + C
    }
    for(ctr=0;ctr<3;ctr++) {
      x_n[ctr] = x_n_plus_1[ctr];
    }
  }
  for(ctr=0;ctr<3;ctr++) {
    printf("%lf\n",x_n[ctr]);
  }
  return 0;
}
...