我正在用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不会绘制三角函数。我怎样才能解决这个问题?任何建议都会被提出。
答案 0 :(得分:0)
有几个问题。
一个原因是使用浮点计算。 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
函数。
结果是:
再次,可能是我不了解您的用例。