Такая вот проблема, пишу алгоритм для расчёта полинома Ньютона и сталкиваюсь с этой ошибкой
Вот код программы:
#include "pch.h"
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
const int n = 4; //константа разменрности массива
float lagranz(float X[n], float Y[n], float x); //объявление метода Лагранжа
float nuton(float X[n], float Y[n], float x); //объявление метода Ньютона
int main()
{
setlocale(0, "");
//Объявление массивов для значений X и Y
float X[n];
float Y[n];
cout << "Количество узлов " << n;
//Введение значений X в массив
cout << "\nВведите массив чисел X\n";
for (int i = 0; i < n; i++) {
cin >> X[i];
}
//Введение значений Y в массив
cout << "Введите массив чисел Y\n";
for (int i = 0; i < n; i++) {
cin >> Y[i];
}
float x;
cout << "Введите число для проверки\n";
cin >> x;
int change;
cout << "Выберите метод решения: 0-полином Лагранжа, 1-полином Ньютона\n";
cin >> change;
//Подсчёт полинома Лагранжа с заданным значениями
if (change == 0) { cout << "\nL(" << x << ") = " << lagranz(X, Y, x) << " " << endl; }
else if (change == 1) { cout << "\nP(" << x << ") = " << nuton(X, Y, x) << " " << endl; }
else { cout << "Было указано неверное значение!"; }
}
//метод для подсчёта полинома Лагранжа
float lagranz(float X[n], float Y[n], float x) { //
float S, P; //переменные суммы и произведения //
S = 0; // *
for (int j = 0; j < n; j++) { // *
P = 1; // *
for (int i = 0; i < n; i++) { // M
if (i != j) { // A
P *= (x - X[i]) / (X[j] - X[i]); // G
} // I
} // C
S += Y[j] * P; // *
} // *
return S; // *
} //
float nuton(float X[n], float Y[n], float x) {
float S, P, h, dY[n-1][n-2], fa, p1;
h = X[1] - X[0];
S = Y[0];
fa = 1;
for (int i = 0; i < n - 1; i++) {
dY[i][0] = Y[i + 1] - Y[i];
}
int k = 1;
for (int l = 0; l < n - 1; l++) {
for (int o = 0; o < n; o++) {
dY[o][k] = dY[o + 1][k - 1] - dY[o][k - 1];
}
k++;
}
p1 = 1;
for (int i = 0; i < n - 1; i++) {
fa *= (i + 1);
p1 *= (x - X[i]);
S += p1 * (dY[0][i] / (fa * pow(h, i + 1)));
}
return S;
}
P.S. Моё внимание привлекают незаполненные части массива dY из-за которого и вылетает
Выход за границы массива float dY[n-1][n-2];
здесь:
for (int o = 0; o < n; o++) {
dY[o][k] = dY[o + 1][k - 1] - dY[o][k - 1];
} // ^~~~~
и здесь:
for (int i = 0; i < n - 1; i++) {
fa *= (i + 1);
p1 *= (x - X[i]);
S += p1 * (dY[0][i] / (fa * pow(h, i + 1)));
} // ^
Виртуальный выделенный сервер (VDS) становится отличным выбором
Дана задача: создать стек из чисел, найдти среднее арифметическое и удалить елементы меньше егоC++ Builder6
Во входном потоке задано три вещественных числа a (a > 0), b (b < 0), x (-1 < x < 1)Значения исходных данных подобраны так, что выражение имеет смысл
Старый пират Пью спрятал свое золото, но для надежности не в одном месте, а частями в нескольких тайникахНо чтобы не забыть места хранения...
Дан линейный массив на N элементовВыполнить циклический сдвиг всех его элементов на один влево начиная с первого нулевого элемента