尝试绘制2条曲线以比较的平方根。文件中的一个是通过Lagrange插值方法计算的,第二个是通过sqrt()方法计算的。
提供的输入:
fid = fopen('xyz.dat','rb');
x = fread(fid,1, 'double');
y = fread(fid,1, 'double');
fclose(fid);
plot(x,y)
a = 16;
b = sqrt(a);
plot (b)
用于在文件“ xyz.dat”中计算和存储值的C代码如下:
#include <stdio.h>
#include <fstream>
int main(void)
{
float x[100],y[100],a,s=1,t=1,k=0;
int n,i,j,d=1;
printf("\n\n Enter the number of the terms of the table: ");
scanf("%d",&n);
printf("\n\n Enter the respective values of the variables x and y: \n");
for(i=0; i<n; i++)
{
scanf ("%f",&x[i]);
scanf("%f",&y[i]);
}
printf("\n\n The table you entered is as follows :\n\n");
for(i=0; i<n; i++)
{
printf("%0.3f\t%0.3f",x[i],y[i]);
printf("\n");
}
while(d==1)
{
printf(" \n\n\n Enter the value of the x to find the respective value of y\n\n\n");
scanf("%f",&a);
for(i=0; i<n; i++)
{
s=1;
t=1;
for(j=0; j<n; j++)
{
if(j!=i)
{
s=s*(a-x[j]);
t=t*(x[i]-x[j]);
}
}
k=k+((s/t)*y[i]);
}
printf("\n\n The respective value of the variable y is: %f",k);
FILE *fp;
fp = fopen("xyz.dat", "wb");
fwrite((char *)x, sizeof(double), 1, fp);
fclose(fp);
printf("\n\n Do you want to continue?\n\n Press 1 to continue and any other key to exit");
scanf("%d",&d);
}
}
希望绘制两条曲线,一条是精确解,另一条是插值结果。
答案 0 :(得分:1)
您的代码中有很多问题。
您提到从文件读取的曲线。但是您的文件中没有曲线。在循环中,您再次创建文件,并每次向其写入1值。
再次打开时,长度将被截断为0,然后再次写入1值。
有关详情,请参见man fopen。
要解决此问题,您应该只在进入循环之前打开文件一次,而在离开循环后关闭文件。
您永远不会检查scanf
是否完全解析了输入。
您将垃圾写入文件:
float x[100]
...
fwrite((char *)x, sizeof(double), 1, fp);
此处x
衰减为指向float
的指针。您欺骗了编译器,并告诉编译器写入double
将使用的字节数。这不会从float
到double
进行任何隐式转换,而只是读取内存,就好像它是一个double一样。这将读取x[0]
和x[1]
并将其写入文件。
在matlab脚本中,您读取一对双精度格式的值。除非您的matlab double
只有C中float
的大小,否则将不匹配。
同样,您似乎期望一对x / y值,但您仅提供2个x值。
另外,您根本不会使用循环中计算出的值。
也许您想写a
和k
吗?
k
。