Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // DFT.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include<cstdlib>
- #include<cstdio>
- #include<iostream>
- #include<cmath>
- #include"gnuplot_i.hpp"
- #include<Windows.h>
- #include<conio.h>
- using namespace std;
- #define pi 2*acos(0.0)
- #define eps 0.01
- double x[510];
- double dft[510];
- int n = 501;
- double f1, f2;
- vector<vector<double>> M;
- vector<double> b;
- vector<double> c;
- void DFT()
- {
- for (int i = 0; i < n; i++)
- {
- double r = 0.;
- double im = 0.;
- for (int j = 0; j < n; ++j) {
- double alpha = double((2 * pi* i * j) / n);
- r += x[j] * double(cos(alpha));
- im += x[j] * double(sin(alpha));
- }
- dft[i] = sqrt(r*r+im*im);
- }
- }
- void wait() {
- FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
- #ifndef FOUT
- cout << endl << "Press any key to continue..." << endl;
- #endif
- _getch();
- }
- void Plot()
- {
- Gnuplot gnu("lines");
- string a = "set style line 1 lc rgb '#0060ad' lt 2 lw 2 pt 0 ps 1.5";
- string b = "C:/Users/Asus/Documents/Visual Studio 2015/Projects/DFT/DFT/temp.txt"; b = "plot '" + b; b += "' using ($1*1):($2) with linespoints ls 1";
- gnu.plot_points(b, a);
- wait();
- system("pause");
- }
- pair<double,double> Find_extr()
- {
- vector<double> a;
- for (int i = 1; i < n / 2; i++)
- {
- if (dft[i] - dft[i-1] > eps && dft[i] - dft[i + 1] > eps) a.push_back((i+1)*0.002);
- }
- if (a.size() > 2) cout << "ERROR" << endl; else
- if (a.size() == 2) return make_pair(a[0], a[1]); else
- return make_pair(a[0],0);
- }
- vector<vector<double>> Matrix()
- {
- vector<vector<double>> A;
- vector<double> a1, a2, a3, a4, a5;
- double sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 6.);
- a1.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 5.);
- a1.push_back(sum);
- a2.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 4.);
- a1.push_back(sum);
- a2.push_back(sum);
- a3.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 3.)*sin(2*pi*f1*i*0.01);
- a1.push_back(sum);
- a4.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 3.);
- a1.push_back(sum);
- a2.push_back(sum);
- a3.push_back(sum);
- a5.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 2.)*sin(2 * pi*i*0.01*f1);
- a2.push_back(sum);
- a4.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 2.);
- a2.push_back(sum);
- a3.push_back(sum);
- a5.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += (i*0.01)*sin(2 * pi*i*0.01*f1);
- a3.push_back(sum);
- a4.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += i*0.01;
- a3.push_back(sum);
- a5.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(sin(2 * pi*i*0.01*f1),2);
- a4.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum +=sin(2 * pi*i*0.01*f1);
- a4.push_back(sum);
- a5.push_back(sum);
- a5.push_back(500.);
- A.push_back(a1);
- A.push_back(a2);
- A.push_back(a3);
- A.push_back(a4);
- A.push_back(a5);
- for (int i = 0; i < 5; i++) cout << A[i].size() << endl;
- return A;
- }
- vector<double> BB()
- {
- vector<double> B;
- double sum;
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(double(i)/100.,3)*x[i];
- B.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 2)*x[i];
- B.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += pow(i*0.01, 1)*x[i];
- B.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += (sin(2 * pi*i*0.01*f1))*x[i];
- B.push_back(sum);
- sum = 0;
- for (int i = 0; i < n; i++) sum += x[i];
- B.push_back(sum);
- cout << B.size() << endl;
- return B;
- }
- vector<double> MKK()
- {
- vector<double>res;
- double temp;
- double U[10][10] = {0};
- double y[10] = { 0 };
- double ans[10] = { 0 };
- for (int i = 0; i < 5; i++)
- {
- temp = 0;
- for (int k = 0; k < i; k++)
- temp = temp + U[k][i] * U[k][i];
- U[i][i] = sqrt(M[i][i] - temp);
- for (int j = i; j < 5; j++)
- {
- temp = 0;
- for (int k = 0; k < i; k++)
- temp = temp + U[k][i] * U[k][j];
- U[i][j] = (M[i][j] - temp) / U[i][i];
- }
- }
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 5; j++) {
- cout << U[i][j] << " ";
- }
- cout << endl;
- }
- for (int i = 0; i < 5; i++)
- {
- temp = 0;
- for (int k = 0; k < i; k++)
- temp = temp + U[k][i] * y[k];
- y[i] = (b[i] - temp) / U[i][i];
- }
- for (int i = 4; i >= 0; i--)
- {
- temp = 0;
- for (int k = i + 1; k < 5; k++)
- temp = temp + U[i][k] * ans[k];
- ans[i] = (y[i] - temp) / U[i][i];
- }
- for (int i = 0; i < 5; i++)
- {
- res.push_back(ans[i]);
- cout << "x" << i << "= " << ans[i] << endl;
- }
- return res;
- }
- int main()
- {
- freopen("f3.txt","r",stdin);
- freopen("temp.txt","w",stdout);
- for (int i = 0; i < n; i++) scanf("%lf",&x[i]);
- DFT();
- for (int i = 0; i < n; i++) printf("%.3lf %.3lf\n",double(i)/100.,dft[i]);
- fclose(stdout);
- freopen("CON","w",stdout);
- // Plot();
- pair<double,double> extr = Find_extr();
- cout << extr.first << " " << extr.second<< endl;
- f1 = extr.first; f2 = extr.second;
- M = Matrix();
- for (int i = 0; i < 5; i++)
- {
- for (int j = 0; j < 5; j++) cout << M[i][j] << " ";
- cout << endl;
- }
- b = BB();
- for (int i = 0; i < 5; i++) cout << b[i] << " ";
- cout << endl;
- c = MKK();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement