diff --git a/AdaptivKvadratur.cc b/AdaptivKvadratur.cc new file mode 100644 index 0000000000000000000000000000000000000000..3a3fc6236498545230adeb8db3a67782e57f23f8 --- /dev/null +++ b/AdaptivKvadratur.cc @@ -0,0 +1,83 @@ + +#include <iomanip> +#include "Header files/AdaptivKvadratur.h" +#include <iostream> +#include <fstream> +#include <string> +#include <stdlib.h> +#include <string> +using namespace std::complex_literals; + +int main() +{ + // PI + const double PI{std::acos(-1)}; + // filnamnet + std::string filename{"sinusKoefficenter.txt"}; + // obj för att komma åt funktioner, output är raderna som skrivs i filenamne + AdaptivKvadratur obj; + std::complex<double> output{}; + // Antal datapunkter + int numDataPoints{30}; + // Perioden för funktionen + double T{2*PI}; + // Undre och övere intergration + double a{0}; + double b{a+T}; + // Tolerans och omega + double epsilon{0.067}; + double omega{2.0*PI/T}; + + // Öppnar eller skapar filen + std::ofstream dataFile; + dataFile.open (filename); + + // sätter önskad antal decimaler + dataFile << std::fixed << std::setprecision(10); + for (int n = 0; n<numDataPoints;n++) + { + output = obj.integrate(a,b,omega,n,epsilon); + dataFile << output*1.0/T << '\n'; + } + + dataFile.close(); + std::cout << "done"<<'\n'; + return 0; +} + +AdaptivKvadratur::AdaptivKvadratur() +{ +} + + +std::complex<double> AdaptivKvadratur::function(double a,double omega, int n) +{ + std::complex<double> functionValue{}; + functionValue = std::sin(a) * std::exp(-1i*a*omega*static_cast<double>(n)); + return functionValue; +} + +std::complex<double> AdaptivKvadratur::integrate(double a, double b, double omega, + int n, double epsilon) +{ + std::complex<double> I1{}; + std::complex<double> I2{}; + std::complex<double> I3{}; + double m{(a+b)/2.0}; + double h{b-a}; + I1 = h/6.0 * (function(a,omega,n)+4.0*function(m,omega,n) + +function(b,omega,n)); + I2 = h/12.0*(function(a,omega,n) + 4.0 * function(h+1/4.0,omega,n) + + 2.0 * function(m,omega,n) + 4.0 * function(b-h/4.0,omega,n) + + function(b,omega,n)); + I3 = I2+(I2-I1)/15.0; + if (std::abs((I3-I2)/I2) > epsilon) + { + I1 = integrate(a, m, omega, n, epsilon/2); + I2 = integrate(m, b, omega, n, epsilon/2); + I3 = I1 + I2; + + } + return I3; +} + diff --git a/DFT.cc b/DFT.cc new file mode 100644 index 0000000000000000000000000000000000000000..fd7b3f220916c0ecb0bcc376ab5a6a00557f89c9 --- /dev/null +++ b/DFT.cc @@ -0,0 +1,87 @@ +#include <complex> +#include <cmath> +#include <iomanip> +#include "Header files/DFT.h" +#include <iostream> +#include <fstream> +#include <string> +using namespace std::complex_literals; + +int main() +{ + // PI + const double PI{std::acos(-1)}; + + // inFile innehåller uHatt data och outFile är resulterande filen + std::string inFile{"sinusKoefficenter.txt"}; + std::string outFile{"sinusFHat.txt"}; + + // Perioden för funktionen + double T{2*PI}; + // Definerar omega,my och n. (n is the size of the vectors,matrix) + double omega{2.0*PI/T}; + std::complex<double> my{std::exp(1i * omega)}; + int const n{20}; + + std::complex<double> F[n][n]; + std::complex<double> fHat[n]; + std::complex<double> uHat[n]; + + std::string dataLine; + std::ifstream uHatData (inFile); + + + // while-loop variabel samt element i uHat + int loop = 0; + std::complex<double> uHatElement; + + + if (uHatData.is_open()) + { + while (std::getline (uHatData,dataLine) ) + { + std::istringstream is(dataLine); + is >> uHatElement; + uHat[loop] = uHatElement; + loop++; + } + uHatData.close(); + } + + // Behövs för att skriva få rätt format på raderna i filename2 + std::ostringstream strConverter; + std::string output; + + + std::ofstream resultFile; + resultFile.open(outFile); + + // Sätter önskad antal decimaler + resultFile << std::fixed << std::setprecision(10); + for(int i = 0; i<n; i++) + { + for(int j = 0; j<n; j++) + { + std::complex<double> exponent = static_cast<double> (i*j); + F[j][i] = std::pow(my,exponent); + fHat[i] = fHat[i] + F[j][i]*uHat[i]; + // Skriver ut F matrisen + std::cout<<F[j][i]<<" "; + } + std::cout <<'\n'; + // Tar bort paranteserna från komplexa talet. Då det blir lättare för PlotData.py + strConverter.str(""); + strConverter << fHat[i]; + output = strConverter.str().substr(1, strConverter.str().size() - 2); + // Skriver in fHat in i resultFile + resultFile << output << '\n'; + } + resultFile.close(); + std::cout << "done"<<'\n'; + return 0; +} + +DFT::DFT() +{ +} + diff --git a/GenerateData.py b/GenerateData.py new file mode 100644 index 0000000000000000000000000000000000000000..2005529045e62b1ce4512dc7f67a569b3ff2be6d --- /dev/null +++ b/GenerateData.py @@ -0,0 +1,15 @@ +import math +# Genererar sinus värden för att jämföra med DFT + +# välj filnamn +filename = 'sinus.txt' +# välj antal datapunkter +numDataPoints = 20 + +file = open(filename, 'w') +# file.write(omega+'\n') +for i in range(numDataPoints): + file.write(str(math.sin(i))+'\n') + pass +file.close() +print('done') diff --git a/Header files/AdaptivKvadratur.h b/Header files/AdaptivKvadratur.h new file mode 100644 index 0000000000000000000000000000000000000000..acaf08f641aca22d452a15e0084fa00009f8991e --- /dev/null +++ b/Header files/AdaptivKvadratur.h @@ -0,0 +1,11 @@ +#include <complex> +#include <cmath> + +class AdaptivKvadratur +{ +public: + AdaptivKvadratur(); + std::complex<double> integrate(double a, double b, double omega, + int n, double epsilon); + std::complex<double> function(double a,double omega, int n); +}; diff --git a/Header files/DFT.h b/Header files/DFT.h new file mode 100644 index 0000000000000000000000000000000000000000..49db810752a1a8af281d0774ee699482cb3cb7a8 --- /dev/null +++ b/Header files/DFT.h @@ -0,0 +1,7 @@ +class DFT +{ +public: + DFT(); + +private: +}; diff --git a/Legacy code/adaptivKvadratur.py b/Legacy code/adaptivKvadratur.py new file mode 100644 index 0000000000000000000000000000000000000000..68e783eeb46fc4565cbe7bf4f959458f3e0d5031 --- /dev/null +++ b/Legacy code/adaptivKvadratur.py @@ -0,0 +1,41 @@ +import cmath + +# sinus +def integrate(a, b, omega, n, epsilon): + m = (a+b)/2 + h = b-a + # e^(-i*t*n*omega) faktorerna + ae = cmath.exp(-a*omega*n*1j) + me = cmath.exp(-m*omega*n*1j) + be = cmath.exp(-b*omega*n*1j) + aeh4 = cmath.exp(-(a+h/4)*omega*n*1j) + beh4 = cmath.exp(-(b-h/4)*omega*n*1j) + I1 = h/3*(cmath.sin(a)*ae+4*cmath.sin(m)*me+cmath.sin(b)*be) + I2 = h/6*(cmath.sin(a)*ae+4*cmath.sin(a+h/4)*aeh4+2*cmath.sin(m)*me+4*cmath.sin(b-h/4)*beh4+cmath.sin(b)*be) + I3 = I2+(I2-I1)/15 + if abs((I3-I2)/I2) > epsilon: + I1 = integrate(a, m, omega, n, epsilon/2) + I2 = integrate(m, b, omega, n, epsilon/2) + I3 = I1 + I2 + pass + return I3 + +filename = 'sinusKoefficenter' +# välj antal datapunkter +numDataPoints = 20; +# välj period +T = 2*cmath.pi +# väl undre och övre integration +a = 0 +b = T + a +# välj tolerans och omega +epsilon = 0.1 +omega = 2*cmath.pi/T + +file=open(filename,'w') + +for i in range(numDataPoints): + file.write(str(i)+';'+str(integrate(a, b, omega, i, epsilon))+'\n') + pass +file.close() +print('done') diff --git a/PlotData.py b/PlotData.py new file mode 100644 index 0000000000000000000000000000000000000000..79a3940810966da44de5e3f631e72fd796dd5800 --- /dev/null +++ b/PlotData.py @@ -0,0 +1,23 @@ +import matplotlib.pyplot as plt +import numpy as np + +filename1 = 'sinus.txt' +filename2 = 'sinusFHat.txt' + +# Tar fram data och plotar datan i filename1 mot x=1...len() +Y = np.loadtxt(filename1, unpack=True) +X = list(range(0,len((Y)))) +plt.scatter(X, Y) +plt.plot(X, Y) + +# Tar fram data och plotar datan i filename2 mot xHat=1...len() +YHat,Imaginary = np.loadtxt(filename2, delimiter =',',unpack=True) +XHat = list(range(0,len((YHat)))) +plt.plot(XHat, YHat) +plt.scatter(XHat, YHat) + +plt.title(filename1) +plt.xlabel('X') +plt.ylabel('Y') +plt.show() +print('done') diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..11763863664236e1947120e4d0f288b821f02fa9 Binary files /dev/null and b/a.out differ diff --git a/sinus.txt b/sinus.txt new file mode 100644 index 0000000000000000000000000000000000000000..65d401a5500d6b7a39224c26258f0f79a39c0124 --- /dev/null +++ b/sinus.txt @@ -0,0 +1,20 @@ +0.0 +0.8414709848078965 +0.9092974268256817 +0.1411200080598672 +-0.7568024953079282 +-0.9589242746631385 +-0.27941549819892586 +0.6569865987187891 +0.9893582466233818 +0.4121184852417566 +-0.5440211108893698 +-0.9999902065507035 +-0.5365729180004349 +0.4201670368266409 +0.9906073556948704 +0.6502878401571168 +-0.2879033166650653 +-0.9613974918795568 +-0.750987246771676 +0.14987720966295234 diff --git a/sinusFHat.txt b/sinusFHat.txt new file mode 100644 index 0000000000000000000000000000000000000000..f435a06c569f8bfcfd4005d6296b70ce04d19fc0 --- /dev/null +++ b/sinusFHat.txt @@ -0,0 +1,20 @@ +-5.35179,0 +0.128618,-0.419678 +0.471065,0.0251305 +-0.00337691,0.299632 +-0.223093,-0.132737 +0.0820078,-0.174555 +-0.785837,-0.17028 +-0.328153,0.495687 +-0.365077,-0.378147 +0.203529,-0.333906 +0.128914,0.0825593 +0.018315,-0.00991071 +0.549578,0.737994 +1.02951,-1.14958 +0.161698,0.376965 +-0.303066,0.0827178 +-0.0466722,-0.0801996 +-0.110187,0.0509128 +0.022323,-0.675769 +-5.82281,0.874292 diff --git a/sinusKoefficenter.txt b/sinusKoefficenter.txt new file mode 100644 index 0000000000000000000000000000000000000000..34ba38710a26184446dd98cc42d9e15058dd780c --- /dev/null +++ b/sinusKoefficenter.txt @@ -0,0 +1,30 @@ +(-0.2675897034,0.0000000000) +(0.0852312069,-0.3773186557) +(0.4327528535,-0.0421730761) +(0.0643636349,0.2955946212) +(-0.3080274028,-0.0740207123) +(0.0277376003,-0.4390337963) +(0.3617780138,-0.0877454965) +(-0.0156795662,0.2689983932) +(-0.3921622667,-0.0799871230) +(-0.0552578280,-0.4239994274) +(0.2850822747,-0.0526451122) +(-0.0813070464,0.3219824211) +(-0.4426410892,-0.0124137418) +(-0.0874494641,-0.3460380783) +(0.2731793450,0.0308569456) +(-0.0721812031,0.4058334340) +(-0.4130538737,0.0665727764) +(-0.0392404662,-0.2768270540) +(0.3370127234,0.0859892698) +(0.0033077054,0.4434591973) +(-0.3306029697,0.0843525910) +(0.0450460354,-0.2799986509) +(0.4178942962,0.0620634560) +(0.0757555249,0.4002667578) +(-0.2710933581,0.0245790224) +(0.0879174198,-0.3526369175) +(0.4414619183,-0.0189232131) +(0.0785540641,0.3159670451) +(-0.2892379013,-0.0577923860) +(0.0499579339,-0.4279585665)