在 C 程序中校准

Calibrating in C program

问题:要测量罐中液体的体积,可以使用深度计(量尺)。它被插入顶部的一个开口中,仪表上的液位可以用来确定罐中的液体量。

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

我们考虑插入一根已经以 10 厘米为单位校准的量尺。这个量规可以插入罐体顶部的一个开口,用来测量罐体中液体的深度。

您的任务是编写一个 C 程序来生成 table 个值,显示液位计上每个点的罐中液体体积。

你的程序的输出(对于上面的例子)应该是这样的:

深度 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;
}

这里和那里有一些错误。首先,让我们为水箱的尺寸使用全局变量,以便函数 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;
}