treść zadania:
Wyznaczyć współczynniki trygonometrycznego wielomianu interpolacyjnego + narysować za pomocą gnuplot węzły [*]
moj kod:
#include <iostream>
#include <cstdlib>
#include <math.h>
#include "gnuplot_i.hpp"
#define GNUPLOT_PATH "C:/gnuplot/binary"
using namespace std;
int i, j, k, z=0, r=1, n=10, m, iloscwsp, wybor, x;
string tytul;
double wartoscinter;
void wyswietlwsp(double wspolczynniki[], int iloscwsp)
{
i=0; j=1;
cout<<wspolczynniki[i]/2<<" + ";
if (n%2==0)
{
while (i<iloscwsp-1)
{
cout<<wspolczynniki[i]<<"cos("<<j<<"x) + ";
i++;
cout<<wspolczynniki[i]<<"sin("<<j<<"x) + ";
i++;
j++;
}
cout<<wspolczynniki[i]/2<<"cos("<<j<<"x)";
}
else
{
while (i<iloscwsp)
{
cout<<wspolczynniki[i]<<"cos("<<j<<"x) + ";
i++;
if(i<iloscwsp-1)
cout<<wspolczynniki[i]<<"sin("<<j<<"x) + ";
else
cout<<wspolczynniki[i]<<"sin("<<j<<"x)";
i++;
j++;
}
}
}
double policz(double wspolczynniki[], int iloscwsp)
{
double wartosc=0; i=0; j=1;
wartosc+=wspolczynniki[i]/2;
if (n%2==0)
{
while (i<iloscwsp-1)
{
wartosc+=wspolczynniki[i]*cos(j*x);
i++;
wartosc+=wspolczynniki[i]*sin(j*x);
i++;
j++;
}
wartosc+=wspolczynniki[i]/2*cos(j*x);
}
else
{
while (i<iloscwsp)
{
wartosc+=wspolczynniki[i]*cos(j*x);
i++;
wartosc+=wspolczynniki[i]*sin(j*x);
i++;
j++;
}
}
return wartosc;
}
void funkcja(double wx[], double wy[])
{
if ((wybor==1)||(wybor==2)||(wybor==3))
{cout<<"podaj ilosc wezlow: "; cin>>n;}
switch (wybor)
{
case 1:
for(i=0; i<n; i++)
{
wx[i]=2*M_PI/n*(i+1);
wy[i]=sin(wx[i]);
}
tytul="wykres funkcji sin(x) oraz jego interpolacji"; break;
case 2:
for(i=0; i<n; i++)
{
wx[i]=2*M_PI/n*(i+1);
wy[i]=cos(wx[i]);
}
tytul="wykres funkcji cos(x) oraz jego interpolacji"; break;
case 3:
for(i=0; i<n; i++)
{
wx[i]=2*M_PI/n*(i+1);
wy[i]=2*wx[i]*wx[i]-3;
}tytul="wykres funkcji 2*x^2-3 oraz jego interpolacji"; break;
default: cout<<"Zly wybor. Wybierz jeszcze raz: ";
}
}
int main()
{
double wx[n], wy[n];
cout << "wybierz funkcje:" << endl;
do
{
cout<<endl<<"1. sin(x) \n2. cos(x) \n3. 2x^2-3"<<endl<<endl;
cin>>wybor; cout<<endl;
funkcja(wx, wy);
}while ((wybor!=1)&&(wybor!=2)&&(wybor!=3));
cout<<endl<<endl<<"policzone wspolrzedne wezlow:"<<endl<<endl;
for(j=0; j<n; j++)
{
cout<<"x: "<<wx[j]<<endl<<"y: "<<wy[j]<<endl<<endl;
}
if (n%2==0)
{
m=n/2;
double A[m+1], B[m-1];
for(i=0; i<m+1; i++)
{
A[i]=0;
B[i]=0;
}
for(j=0; j<m; j++)
{
for(k=0; k<n; k++)
{
A[j]+=(wy[k]*cos(k*wx[j]));
}
A[j]*=2/n;
}
for(j=0; j<m-2; j++)
{
for(k=0; k<n; k++)
{
B[j]+=(wy[k]*sin(k*wx[j]));
}
B[j]*=2/n;
}
double wspolczynniki[2*m];
wspolczynniki[z]=A[0]/2; z++;
while (z<(2*m-1))
{
wspolczynniki[z]=A[r];
z++;
wspolczynniki[z]=B[r];
z++;
r++;
}
wspolczynniki[z]=A[m]/2;
iloscwsp=2*m;
wyswietlwsp(wspolczynniki, iloscwsp);
wartoscinter=policz(wspolczynniki, iloscwsp);
}
else
{
m=(n-1)/2;
double A[m+1], B[m];
for(i=0; i<m+1; i++)
{
A[i]=0;
B[i]=0;
}
for(j=0; j<m; j++)
{
for(k=0; k<n; k++)
{
A[j]+=(wy[k]*cos(k*wx[j]));
}
A[j]*=2/n;
}
for(j=0; j<m-1; j++)
{
for(k=0; k<n; k++)
{
B[j]+=(wy[k]*sin(k*wx[j]));
}
B[j]*=2/n;
}
double wspolczynniki[2*m+1];
wspolczynniki[z]=A[0]/2; z++;
while (z<(2*m+1))
{
wspolczynniki[z]=A[r];
z++;
wspolczynniki[z]=B[r];
z++;
r++;
}
iloscwsp=2*m+1;
wyswietlwsp(wspolczynniki, iloscwsp);
wartoscinter=policz(wspolczynniki, iloscwsp);
}
Gnuplot::set_GNUPlotPath("C:\\gnuplot\\binary\\");
Gnuplot main_plot;
// Podpisy na wykresie, żeby było wiadomo co na nim widać
main_plot.set_title( tytul );
main_plot.set_xlabel( "OX" );
main_plot.set_ylabel( "OY" );
// styl rysowania wykresu
main_plot.set_style( "lines" );
// siatka poprawia czytelność
main_plot.set_grid();
// zakres osi x
main_plot.set_xrange( 0 , 2*M_PI ) ;
// funkcja do narysowania
switch(wybor)
{
case 1: main_plot.plot_equation( "sin(x)" , "sin(x)" );
// main_plot.plot_equation( "policz(wspolczynniki, iloscwsp)" , "interpolacja sin(x)" );
main_plot.set_style( "points" );
main_plot.set_pointsize( 2.0 );
/* vector<double> x( n );
for(i=0; i<n; i++)
{
x[i]=wx[i];
}
vector<double> y( n );
for(j=0; j<n; j++)
{
y[i]=wy[i];
}*/
main_plot.plot_xy( wx, wy, "wezly interpolacyjne" );
break;
case 2: main_plot.plot_equation( "cos(x)" , "cos(x)" ); break;
case 3: main_plot.plot_equation( "2*x*x-3" , "2*x*x-3" ); break;
}
system("pause");
return 0;
}
męczę się i męczę, za Chiny ludowe nie moge skompilować, proszę o pomoc !