gnuplot中的三角函数图

时间:2018-12-01 14:32:10

标签: c gnuplot

我正在用C代码制作三角函数的坐标,并将它们保存到.dat文件中以在gnuplot中进行绘制。这是我的代码

#include<stdio.h>
#define N 100
double tent(double x){
if(0<=x && x<=0.5){
        return 2*x;
}
if(0.5<x && x<=1){
        return 2*(1-x);
        }
}

int main(void){
int n;
double x[102];
x[0]=0.7;
for(n=0;n<=N;n++){
x[n+1] = tent(x[n]);
printf("%lf %lf\n",x[n],x[n+1]);
printf("%lf %lf\n",x[n+1],x[n+1]);
}
return 0;
}

执行此代码时,已在.dat文件中正确设置了x坐标数据和y坐标数据,但该数据未按预期输出输出。

这是.dat文件内容的一部分。

0.400000 0.800000
0.800000 0.400000
0.400000 0.799999
0.799999 0.400002
0.400002 0.800003
0.800003 0.399994
0.399994 0.799988
0.799988 0.400024
0.400024 0.800049
0.800049 0.399902
0.399902 0.799805

我不知道为什么,但是在途中它收敛到0。因此,gnuplot不会绘制三角函数。我怎样才能解决这个问题?任何建议都会被提出。

1 个答案:

答案 0 :(得分:0)

有几个问题。

  1. 为什么会收敛到0?

一个原因是使用浮点计算。 Here,您可以找到更多详细信息。解释极限0而非无限或其他原因的另一个原因是方程的不动点行为。 (我认为,第二个原因很有趣,但这超出了这个问题的范围,弄清楚它的工作原理将无助于我们绘制三角函数。)

  1. 返回tent函数的值。

如果x <0或x> 1,则您的tent函数没有return。编译器应为此警告您。 (我使用gcc -Wall进行编译。)您应该添加return 0;

  1. 函数的用法。

我了解您的函数double tent(double x)如下:它接受一个参数x并计算其对应的y值。但是,在调用该函数时,始终将y值作为输入来计算另一个y值。这真的是您想要的吗?

我认为您可能想拥有一个x值的数组,然后计算相应的y值的数组。

  1. 您为什么有两个print语句?

可能是我不了解您的用例。

  1. 为什么需要数组?

您计算一个值并打印。不需要数组,还是我错了?

  1. 在各处使用N

请勿在某些点上使用N,而在其他点上请勿使用硬编码的102。并且,避免同时使用100和102。

直到现在,我们到达以下C代码:

#include<stdio.h>
#define N 11 // instead of 101 just for debugging

double tent(double x){
   if(0<=x && x<=0.5){
      return 2*x;
   }
   if(0.5<x && x<=1){
      return 2*(1-x)
   }
   return 0;
}

int main(void){
   double x;
   double y;
   double x0 = 0.0;
   double x1 = 1.0;

   for(int n=0; n < N; n++) {
      x = x0 + n*(x1-x0)/(N-1);
      y = tent(x);
      printf("%lf %lf\n", x, y);
   }
   return 0;
}

这是输出:

0.000000 0.000000
0.100000 0.200000
0.200000 0.400000
0.300000 0.600000
0.400000 0.800000
0.500000 1.000000
0.600000 0.800000
0.700000 0.600000
0.800000 0.400000
0.900000 0.200000
1.000000 0.000000

您可以使用plot "a.dat" with lines进行绘制。

  1. 您是否完全需要C代码?

您可以在gnuplot中直接绘制三角函数:

set xrange [-1:2]
set samples 1000
plot (abs(x-0.5) < 0.5) ? (1 - 2*abs(x-0.5)) : 0

函数定义取自Wikipedia,并适应您的tent函数。 结果是:

triangular function

再次,可能是我不了解您的用例。