在 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;
}
问题:要测量罐中液体的体积,可以使用深度计(量尺)。它被插入顶部的一个开口中,仪表上的液位可以用来确定罐中的液体量。
水箱的宽度为 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;
}