C/C++

Необходимо вычислить аппроксимацию данных квадратичной функцией f(x)=at2+bt+c.Вычислить коэффициенты a,b и c

У Вас есть массив точек длины N:
(x₁,y₁₁), (x₂,y₂), ..., (xᵢ,yᵢ), i=1, ..., N (N>2).
А также объясняющая функция:
y = f(x) = ax² + bx + c.
Вам сначала надо составить невязку:
J =Σ(i=1;N)(f(xᵢ) - yᵢ)²=Σ(i=1;N)(axᵢ²+bxᵢ+c-yᵢ)².
А для невязки найти значения коэффициентов a, b и с методом наименьших квадратов. При вычисленных значениях этих трёх коэффициентов значение самой невязки, то есть разброс данных, окажется минимальным:
∂J/∂a = 2•Σ(i=1;N)xᵢ²•(axᵢ²+bxᵢ+c-yᵢ) = 0
∂J/∂b = 2•Σ(i=1;N)xᵢ•(axᵢ²+bxᵢ+c-yᵢ) = 0
∂J/∂c = 2•Σ(i=1;N)(axᵢ²+bxᵢ+c-yᵢ) = 0.
В результате получается система трёх линейных алгебраических уравнений относительно коэффициентов полинома f(x) с симметричной матрицей. Дальше ищем решение системы по методу Крамера. Я ещё покажу буквенно что за симметричная система получается и что мы будем вычислять:
A B C | E
B C D | F
C D 1 | G
А теперь сама программа:
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
int i, N;
cout << "N: ";
cin >> N;
double xx, A, B, C, D, E, F, G,
d, d1, d2, d3, a, b, c;
A = B = C = D = E = F = 0;
double *x = new double [N];
double *y = new double [N];
for (i = 0; i < N; i++)
{
cout << i + 1 << ") ";
cin >> x[i] >> y[i]; xx = x[i] * x[i];
A += xx * xx; B += xx * x[i]; C += xx;
D += x[i]; E += y[i] * xx; F += x[i] * y[i];
G += y[i];
}
d = A * C + 2. * B * D * C - C * C * C
- B * B - A *D * D;
d1 = E * C + B * D * G + C * D * F
- C * C * G - B * F - E * D * D;
d2 = A * F + E * D * C + C * B * G
- F * C * C - E * B - A * D * G;
d3 = A * C * G + B * F * C + B * D * E
- C * C * E - B * B * G - A * F * D;
a = d1 / d; b = d2 / d; c = d3 / d;
cout << endl << a << ' '
<< b << ' ' << c << endl;
delete [] x; delete [] y;
cin.get(); cin.get(); return 0;
}
Проверяйте! Введите, например, следующие данные. Сначала
N: <вводите 4>
Потом по приглашению номер пары - скобка: х и у через пробел
1) 0 0
2) 1 1
3) 2 4
4) 3 9
И получите коэффициенты
1 0 0
как, собственно, и должно быть, ведь вводился аргумент х и его точный квадрат...
❃ ❃ ❃ ❃ ❃
Andrey Skannler
Andrey Skannler
66 572
Лучший ответ

Похожие вопросы