gnuplot中的三角函数图

问题描述 投票:-1回答:1

我在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没有绘制三角函数。我怎样才能解决这个问题?任何建议都会被暗示。

c gnuplot
1个回答
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

同样,可能是我不理解你的用例。

© www.soinside.com 2019 - 2024. All rights reserved.