在C程序中校准

时间:2015-11-25 23:13:57

标签: c numerical-integration

问题:为了测量水箱中的液体体积,可以使用深度计(测量棒)。它被插入顶部的开口中,仪表上的液位可用于确定水箱中的液体量。

坦克的宽度为w,高度为h,长度为len(以m为单位)。在下面显示的示例输出中,我们采用w = 8,h = 4和len = 7。您的程序应该适用于w,h和len的任何值,而不仅仅是这些特定的值。

我们考虑插入已经以10厘米为单位校准的测量棒。该测量仪可以插入水箱顶部的开口处,用于测量水箱中液体的深度。

您的任务是编写一个C程序,生成一个值表,显示仪表上每个点的液体体积。

程序的输出(如上例所示)应如下所示:

深度10厘米:体积1.188814立方米

深度20厘米:体积3.336448立方米

深度30厘米:体积5.992683立方米 。 。

深度380厘米:体积172.547399立方米

深度390厘米:体积174.657114立方米

深度400厘米:体积175.743037立方米

方法 如果罐具有宽度W和高度H(以厘米为单位),则横截面的焦点半径为A = W / 2且B = H / 2。那么椭圆的方程是: X ^ 2 / A ^ 2 + Y ^ 2 / B ^ 2 = 1

要在给定深度处找到体积,您应使用数值积分计算每个给定深度的储罐横截面积 算法,如梯形法。

 #include <stdio.h>
 #include <math.h>
 #include <stdlib.h>
 double WIDTH;
 double HEIGHT;
 double LENGTH;

 //Function: y in terms of x
 typedef double (*DFD) (double);
 double f (double x)
 {
 double a = HEIGHT / 2.0;
 double b = WIDTH / 2.0;
 double y = (b / a) * sqrt (a * a - x * x);

return y;
}

//Integrating the function -> Area
double trapezoidal_int (DFD f ,double a, double b, int n){

 double x, dx, sum=0.0;
 int i=0;
 dx = (b-a)/ n;
 sum = (f(a) + f(b))/2;
 for (i=1, x = a + dx; i < n; i++, x += dx)
  sum += f(x);
 return 2.0 * sum * dx;
 }

int main ()
{
int h_cm;
printf ("Enter Width of the tank (in m):\n");
scanf ("%lf",&WIDTH);

printf ("Enter Height of the tank (in m):\n");
scanf ("%lf",&HEIGHT);

printf ("Enter Length of the tank(in m):\n");
scanf ("%lf",&LENGTH);

for (h_cm = 0; h_cm <= HEIGHT * 100; h_cm += 10) {
    double h = h_cm / 100.0;
    double area = trapezoidal_int (&f, HEIGHT / 2 - h, HEIGHT / 2, 100);
    double volume = area * LENGTH;

    printf ("Depth %d cm:  Volume %.6lf cubic metres\n",
            h_cm, volume);
}

return 0;
}

1 个答案:

答案 0 :(得分:1)

这里和那里都有一些错误。首先,让我们使用全局变量作为坦克的维度,以便函数f()可以使用它们:

double WIDTH;
double HEIGHT;
double LENGTH;

你的函数f()的高度和宽度是反转的:

double f (double x)
{
    double a = HEIGHT / 2.0;
    double b = WIDTH / 2.0;
    double y = (b / a) * sqrt (a * a - x * x);

    return y;
}

测量长轴两侧所需的积分值的加倍应该在main()而不是trapezoidal_int()中完成。如果有一个函数没有顾名思义,那就不好了。

整合的界限也是错误的:

int main ()
{
    int h_cm;

    WIDTH = 8.0;                                                
    HEIGHT = 4.0;                                      
    LENGTH = 7.0;

    for (h_cm = 0; h_cm <= HEIGHT * 100; h_cm += 10) {
        double h = h_cm / 100.0;
        double area = 2.0 * trapezoidal_int (&f, HEIGHT / 2 - h,
                                             HEIGHT / 2, 100);
        double volume = area * LENGTH;

        printf ("Depth %d cm:  Volume %.6lf cubic metres\n",
                h_cm, volume);
    }

    return 0;
}