我在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没有绘制三角函数。我怎样才能解决这个问题?任何建议都会被暗示。
有几个问题。
一个原因是使用浮点计算。 Here你可以找到更多细节。解释限制0而不是无限或其他的另一个原因是等式的固定点行为。 (我认为,第二个原因很有意思,但它超出了这个问题的范围,弄清楚它是如何工作的,无法帮助我们绘制三角函数。)
tent
函数的返回值。如果x <0或x> 1,你的tent
函数没有return
。你的编译器应该给你一个警告。 (我用gcc -Wall
编译。)你应该添加return 0;
。
我理解你的函数double tent(double x)
如下:它需要一个参数x
并计算其对应的y
值。但是当你调用函数时,你总是将y
值作为输入来计算另一个y
值。这真的是你想要的吗?
我想你可能想要一个x
值的数组,然后计算相应的y
值的数组。
print
陈述?可能是因为我不了解你的用例。
您计算一个值并打印出来。不需要阵列,或者我错了?
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
绘制这个。
您可以直接在gnuplot中绘制三角函数:
set xrange [-1:2]
set samples 1000
plot (abs(x-0.5) < 0.5) ? (1 - 2*abs(x-0.5)) : 0
函数定义取自Wikipedia并适应您的tent
函数。这是结果:
同样,可能是我不理解你的用例。