#include <iostream>
#include <math.h>
#include <fstream>
#include <string>
using namespace std;
// y = cos^2(x) * sin(sqrt(5)*x)
// metoda potęgowa
double y(double x) {
return (cos(x)*cos(x))*sin((sqrt(5)*x));
}
void dyskretyzuj(double a, double b, double n, double *X, double *Y) {
for (int i = 0; i <= n; i++){
X[i] = a + i * (b - a) / n;
Y[i] = y(X[i]);
}
}
void macierzGR(double **G, double *R, double *X, double *Y, double m, double n){
double pom = 0;
for (int k = 0; k <= m; k++){
for (int j = 0; j <= m; j++){
pom = 0;
for (int i = 0; i <= n; i++){
pom += pow(X[i], j + k);
}
G[k][j] = pom;
}
}
for (int k = 0; k <= m; k++){
pom = 0;
for (int i = 0; i <= n; i++){
pom += Y[i] * pow(X[i], k);
}
R[k] = pom;
}
}
void rozwiaz(double **G, double *R, double *A, int m){
for (int k = 1; k < m; k++){
for (int i = k + 1; i < m; i++){
for (int j = k + 1; j < m; j++){
if (G[k][k] == 0){
for (int l = 0; l < m; l++){
G[k][l] += G[k + 1][l];
}
R[k] += R[k + 1];
}
else{
G[i][j] -= ((G[i][k] * G[k][j]) / G[k][k]);
}
}
R[i] -= ((G[i][k] * R[k]) / G[k][k]);
}
}
for (int i = 1; i <= m; i++){
for (int j = 0; j < i; j++){
G[i][j] = 0;
}
}
double suma = 0;
A[m] = R[m] / G[m][m];
for (int i = m - 1; i >= 0; i--){
for (int j = i + 1; j < m; j++){
suma += G[i][j] * A[j];
}
A[i] = ((R[i] - suma) / G[i][i]);
suma = 0;
}
}
double delta(double *X, double *Y, double *A, int m, int n){
double suma = 0;
for (int i = 0; i <= n; i++){
double suma2 = 0;
for (int j = 0; j <= m; j++){
suma2 += A[j] * pow(X[i], j);
}
suma2 -= Y[i];
suma += pow(suma2, 2);
}
suma /= (double)(n + 1);
return sqrt(suma);
}
double Q(double *A, double x, int m){
double suma = 0;
for (int j = 0; j < m; j++){
suma += A[j] * pow(x, j);
}
return suma;
}
void zapisz(double a, double b, int n, int m, double *X, double *Y, double **G, double *R, double *A, double blad, string s){
ofstream plik(s);
plik << "n = " << n << "\tm = " << m << "\t <a, b> = " << a << " " << b << endl;
plik << "\nX\tY\tQ\n";
for (int i = 0; i <= n; i++){
plik << X[i] << "\t" << Y[i] << "\t" << Q(A, X[i], m) << endl;
}
plik << "\nA\n";
for (int i = 0; i <= m; i++){
plik << A[i] << endl;
}
plik << "\nBlad = " << blad << endl;
plik.close();
}
int main() {
double a = -2;
double b = 2;
int n = 49;
int m = 1;
for (m; m < 20; m++){
double *X = new double[n + 1];
double *Y = new double[n + 1];
double **G = new double*[m + 1];
double *R = new double[m + 1];
double *A = new double[m + 1];
for (int i = 0; i <= m; i++){
G[i] = new double[m + 1];
}
dyskretyzuj(a, b, n, X, Y);
macierzGR(G, R, X, Y, m, n);
rozwiaz(G, R, A, m);
string str = "wynik" + to_string(m) + ".txt";
zapisz(a, b, n, m, X, Y, G, R, A, delta(X, Y, A, m, n), str);
}
system("pause");
return 0;
}