傅里叶级数系数​​ gnuplot

Fourier series coefficients gnuplot

这个程序应该找到傅里叶级数的系数,然后绘制根据计算值构建的函数。

分段是

h(t)=1+(t/pi) 对于 t<0 h(t)=1-(t/pi) 对于 t>0

#include <stdio.h>
#include <math.h>
#include "comphys.c"
#include "comphys.h"
#define pi 3.141592653589793

double trap1 (double l, double u, int m, int N);
double trap(double l,double u,int m,int N); // Use trapezoidal method
double inte(double x,int m);
double integrand(double x, int m); // This is the integrand of the bms
double w=1.0; //omega (here - w-2pi/Period where Period=2pi)
int main()
{
  FILE *out,*rsp;
  int m; // Index of the b coefficients
  int M=5; // Number of coeeficients to compute
  int T=201;  // Number of time steps 
  int t; // This is a counter to keep track of the h(t) function to plot
  double *b,*h,j,dj,*a,a0;
  double ll,ul;
  a=dvector(1,M);
  b=dvector(1,M);  // coefficients
  h=dvector(1,T);  // function built from Fourier terms
  ll=-pi;  // lower time limit
  ul=pi;   // upper time limit

  // Prepare to write for plotting
  printf("\nBrute force complex Fourier transform algorithm");
  if ((out=fopen("fs.out","w"))==NULL) {
    printf("\nCannot open file for output\n");
    getchar();
    return(0);          
  }

  // Loop through the wave numbers    
  for (m=1;m<=M;m++)
    {
      b[m]=(1.0/pi)*trap(ll,ul,m,T);
      a[m]=(1.0/pi)*trap1(ll,ul,m,T);
      printf("\nb[%d]=%f   a[%d]=%f",m,b[m],m,a[m]);

      // Build the h(t) function as we go
      t=0;
      dj=(ul-ll)/(double)T;
      for (j=ll;j<=ul;j+=dj)
    {
      t++;
      h[t]+=(b[m]*sin((double)m*w*j))+(a[m]*cos((double)m*w*j));
    }
    }

  // Write out for plotting
  t=0;
  for (j=ll;j<=ul;j+=dj)
    {
      t++;
      fprintf(out,"%f %f\n",j,h[t]);
    }
  fclose(out);
  printf("\nProgram complete without known error.\n");

  if((rsp = fopen("gnuplot.rsp","w")) == NULL)
    {
      printf("\nCannot open gnuplot.rsp for writing\n");
      exit(1);
    }
  fprintf(rsp,"plot '%s' using 1:2 with lines\n",out);
  fprintf(rsp,"pause mouse\n");
  fprintf(rsp,"replot\n");
  fclose(rsp);
  if(system("gnuplot gnuplot.rsp") == -1)
    {
      printf("\nCommand could not be executed\n");
      exit(1);
    }
  return;
}

double trap (double l, double u, int m, int N)

{
  double x,integral,dx;
  int i;

  if (u==l) return (0.0);
  dx=(u-l)/(double)(N-1);

  integral=0.0;
  integral+=0.5*(integrand(u,m)-integrand(l,m));
  x=l+dx;
  for (i=1;i<N;i++)
    {
      integral += integrand(x,m);
      x+=dx;
    }
  integral*=dx;
  printf("\n%f\n",integral);
  return(integral);
}

double trap1 (double l, double u, int m, int N)
{
  double x,integral,dx;
  int i;

  if (u==l) return (0.0);
  dx=(u-l)/(double)(N-1);

  integral=0.0;
  integral+=0.5*(inte(u,m)-inte(l,m));
  x=l+dx;
  for (i=1;i<N;i++)
    {
      integral += inte(x,m);
      x+=dx;
    }
  integral*=dx;
  return(integral);
}


double integrand(double x, int m)
{
  if (x<0) return (sin((double)m*w*x)+((x/pi)*sin((double)m*w*x)));
  return(sin((double)m*w*x)-((x/pi)*sin((double)m*w*x)));
}

double inte(double x,int m)
{
  if (x<0) return (cos((double)m*w*x)+((x/pi)*cos((double)m*w*x)));
  return(cos((double)m*w*x)-((x/pi)*cos((double)m*w*x)));
}

我遇到的问题是,它可以很好地编译并列出系数(不知道它们是否正确或其他任何东西),但最后在尝试绘制时它给了我

"cant read data file "?,??? "gnuplot.rsp", line:1 util.c: 没有那个文件或目录

而且我不知道如何解决这个问题。我用 gnuplot 绘制了很多程序,所以它不应该是丢失的文件或任何东西。

此处:

fprintf(rsp,"plot '%s' using 1:2 with lines\n",out);  

你应该直接使用字符串 "fs.out" 而不是 "out" 这是一个 FILE 指针(并且也已经关闭)。