Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / 3lab

.cpp
Скачиваний:
2
Добавлен:
26.01.2024
Размер:
2.6 Кб
Скачать
#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;
}
Соседние файлы в папке Лабы