无法使用Matlab绘制曲线

时间:2019-05-08 06:25:44

标签: c matlab numerical-methods

尝试绘制2条曲线以比较的平方根。文件中的一个是通过Lagrange插值方法计算的,第二个是通过sqrt()方法计算的。
提供的输入

  • 1 1
  • 4 2
  • 9 4
  • 16 (要计算的x值)

没有显示线/曲线。 enter image description here

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);
    }
}

希望绘制两条曲线,一条是精确解,另一条是插值结果。

1 个答案:

答案 0 :(得分:1)

您的代码中有很多问题。

  1. 您提到从文件读取的曲线。但是您的文件中没有曲线。在循环中,您再次创建文件,并每次向其写入1值。 再次打开时,长度将被截断为0,然后再次写入1值。 有关详情,请参见man fopen

    要解决此问题,您应该只在进入循环之前打开文件一次,而在离开循环后关闭文件。

  2. 您永远不会检查scanf是否完全解析了输入。

  3. 您将垃圾写入文件:

float x[100]
...
fwrite((char *)x, sizeof(double), 1, fp);

此处x衰减为指向float的指针。您欺骗了编译器,并告诉编译器写入double将使用的字节数。这不会从floatdouble进行任何隐式转换,而只是读取内存,就好像它是一个double一样。这将读取x[0]x[1]并将其写入文件。

在matlab脚本中,您读取一对双精度格式的值。除非您的matlab double只有C中float的大小,否则将不匹配。 同样,您似乎期望一对x / y值,但您仅提供2个x值。 另外,您根本不会使用循环中计算出的值。

也许您想写ak吗?

  1. 您可能应该在每次循环循环之后重置k