Чтобы увидеть, что делает ваш код, измените вычисления на printf
s, например:
for(int i = 0; i < 7; i++)
{
printf("y[%d] = 0\n", i);
for(int j = 0; j <= i; j++)
{
printf("y[%d] += h[%d] * x[%d]\n", i, j, i-j);
}
printf("\n");
}
Вывод этого кода (добавлены комментарии):
y[0] = 0
y[0] += h[0] * x[0]
y[1] = 0
y[1] += h[0] * x[1]
y[1] += h[1] * x[0]
y[2] = 0
y[2] += h[0] * x[2]
y[2] += h[1] * x[1]
y[2] += h[2] * x[0]
y[3] = 0
y[3] += h[0] * x[3]
y[3] += h[1] * x[2]
y[3] += h[2] * x[1]
y[3] += h[3] * x[0]
y[4] = 0
y[4] += h[0] * x[4] // zero x
y[4] += h[1] * x[3]
y[4] += h[2] * x[2]
y[4] += h[3] * x[1]
y[4] += h[4] * x[0] // zero h
y[5] = 0
y[5] += h[0] * x[5] // zero x
y[5] += h[1] * x[4] // zero x
y[5] += h[2] * x[3]
y[5] += h[3] * x[2]
y[5] += h[4] * x[1] // zero h
y[5] += h[5] * x[0] // zero h
y[6] = 0
y[6] += h[0] * x[6] // zero x
y[6] += h[1] * x[5] // zero x
y[6] += h[2] * x[4] // zero x
y[6] += h[3] * x[3]
y[6] += h[4] * x[2] // zero h
y[6] += h[5] * x[1] // zero h
y[6] += h[6] * x[0] // zero h
Прокомментированные вычисления - пустая трата времени, поскольку либо значение h
, либо значение x
будут равны нулю. Чтобы избежать ненужных вычислений, код должен скорректировать начальные и конечные значения j
.
Когда i<=3
начальное значение для j
равно 0
, в противном случае начальное значение равно i-3
.
Когда i<=3
конечное значение для j
равно i
, в противном случае конечное значение равно 3
.
Следовательно, циклы должны выглядеть следующим образом:
for(int i = 0; i < 7; i++)
{
printf("y[%d] = 0\n", i);
int start = (i <= 3) ? 0 : i-3;
int end = (i <= 3) ? i : 3;
for(int j = start; j <= end; j++)
{
printf("y[%d] += h[%d] * x[%d]\n", i, j, i-j);
}
printf("\n");
}
Вывод:
y[0] = 0
y[0] += h[0] * x[0]
y[1] = 0
y[1] += h[0] * x[1]
y[1] += h[1] * x[0]
y[2] = 0
y[2] += h[0] * x[2]
y[2] += h[1] * x[1]
y[2] += h[2] * x[0]
y[3] = 0
y[3] += h[0] * x[3]
y[3] += h[1] * x[2]
y[3] += h[2] * x[1]
y[3] += h[3] * x[0]
y[4] = 0
y[4] += h[1] * x[3]
y[4] += h[2] * x[2]
y[4] += h[3] * x[1]
y[5] = 0
y[5] += h[2] * x[3]
y[5] += h[3] * x[2]
y[6] = 0
y[6] += h[3] * x[3]
Это позволяет избежать потери вычисления и устраняет необходимость дополнения массивов h
и x
.