Добавил:
ArGoN4ik
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 3lab
.cpp#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
constexpr double a = 0.02;
constexpr double b = 0.01;
constexpr double c = 1;
constexpr double m = 0.7;
constexpr double k = 0.3; // Омега
constexpr double l = 2.15;
constexpr int N = 20;
constexpr int M = 10;
double f4(double x) {
return m * log(k * x + l);
}
double f3(double x) {
return exp(a * pow(x, 2) + b * x + c);
}
double f(double x) {
return f3(x) * f4(x);
}
double* GAUS(double** _D, double* _B, int n) {
double* B = new double[n];
double** M = new double* [n];
for (int i = 0; i < n; i++) {
M[i] = new double[n];
B[i] = _B[i];
for (int j = 0; j < n; j++)
M[i][j] = _D[i][j];
}
double* X = new double[n];
double aii, tmp;
for (int c = 0; c < n; c++) {
aii = abs(M[c][c]);
int p = c;
for (int b = c + 1; b < n; b++) {
if (abs(M[b][c]) > aii) {
p = b;
aii = abs(M[p][c]);
}
}
if (p != c) {
for (int j = c; j < n; j++)
swap(M[c][j], M[p][j]);
swap(B[c], B[p]);
}
aii = M[c][c];
M[c][c] = 1;
for (int j = c + 1; j < n; j++)
M[c][j] /= aii;
B[c] /= aii;
for (p = c + 1; p < n; p++) {
tmp = M[p][c];
M[p][c] = 0;
if (tmp != 0)
for (int j = c + 1; j < n + 1; j++)
M[p][j] -= tmp * M[c][j];
B[p] -= tmp * B[c];
}
}
for (int i = n - 1; i >= 0; i--) {
X[i] = 0;
tmp = B[i];
for (int j = n - 1; j >= i; j--) {
tmp -= M[i][j] * X[j];
}
X[i] = tmp;
}
return X;
}
int main() {
double dX = (4.0 - 1.0) / N;
double* X = new double[N + 1];
for (int i = 0; i < N; i++) {
X[i] = 1.0 + dX * i;
}
X[N] = 4;
double* Y = new double[N + 1];
for (int i = 0; i < N + 1; i++) {
Y[i] = f(X[i]);
}
double** B = new double* [M];
double* C = new double[M];
for (int b = 0; b < M; b++) {
B[b] = new double[M];
C[b] = 0;
for (int j = 0; j < N + 1; j++)
C[b] += pow(X[j], b) * Y[j];
for (int c = 0; c < M; c++) {
B[b][c] = 0;
for (int j = 0; j < N + 1; j++)
B[b][c] += pow(X[j], b + c);
}
}
double* A = GAUS(B, C, M);
for (int i = 0; i < M; i++) {
cout << "a" << i << " = " << A[i] << '\t';
}
cout << '\n';
double D = 0;
for (int i = 0; i < N + 1; i++) {
double tmp = 0;
for (int j = 0; j < M; j++) {
tmp += A[j] * pow(X[i], j);
}
D += pow(tmp - Y[i], 2.0);
cout << "phi(x" << i << ") = " << tmp << '\t' << "f(x" << i << ") = " << Y[i] << '\n';
}
cout << "delta = " << sqrt(D / (N + 1)) << '\n';
delete[] A;
system("pause");
return 0;
}