本文最后更新于291 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言
大一下学期,突然要开始学大学物理了,这对我简直就是噩梦,高中物理真的学的我够呛,然后还要做物理实验,实验的数据还要进行复杂的数据处理,自己不想算,在网上找的感觉也不够方便。
作为专业是计算机的,我们就是要用代码来解决问题,所以就心血来潮自己用C语言来写了。其实也不难,就是写写公式来算数据,但是在写的过程中还是遇到了一些问题,对自己来说并没有想象的那么简单。
下面的图就是数据处理的公式
我在用代码来写这些公式的时候,并没有遇到什么问题,遇到问题主要是对合成不确定度进行修约的时候,修约规则如图。
修约规则看起来不难,但是用代码描述起来对我来说真有点小难度,自己写的时候,写着写着逻辑就乱了,只能不断调试,自己不会用Visual Studio 2022对代码进行调试,都是用printf来看某一步的数据进行了之后的数据改变的,逻辑乱有一部分原因也是因为自己写代码的时候没有注释的习惯。
也不知道有没有什么头文件包含特殊函数可以解决这个问题
自己写的C语言代码如下:
#include<stdio.h>
#include<math.h>
double Average(double arr[], int datalen)
{
double sum = 0;
for (int j = 0; j < datalen; j++)
{
sum += arr[j];
}
double aver = sum / datalen;
printf("输入数据的平均数为:%.6f\n", aver);
return aver;
}
double Ua(double arr[],int datalen, double average)
{
double summ = 0;
for (int h = 0; h < datalen; h++)
{
double a1 = arr[h] - average;
double a2 = a1 * a1;
summ += a2;
}
double a3 = summ / (datalen * (datalen - 1));
double ua = sqrt(a3);
printf("数据的A类不确定度为:%.9f\n", ua);
return ua;
}
void xiu(double num,double av)
{
double target;
int first_digit = (int)num;
int y = 1;
while (!first_digit)
{
double v1 = num * 10;
first_digit = (int)v1;
y++;
num = num * 10;
}
int tenn = pow(10, y - 1);
double numm = (num - first_digit) * 10;
double nummm = numm;
double nu = (nummm - (int)nummm) * 10;
numm = (int)numm;
if (first_digit >= 3)
{
target = first_digit / (1.0 * tenn);
if (numm != 0)
{
target = 1 / (1.0 * tenn) + target;
}
printf("数据的合成不确定度修约为%.*lf\n", y - 1, target);
double xx = target * 2;
printf("测量结果的完整表示为:x=%lf±%.*lf\n", av, y-1, xx);
printf("\n");
}
else {
target = first_digit / (1.0 * tenn);
target = target + numm / (1.0 * tenn * 10);
if ((int)nu != 0) {
target = 1 / (1.0 * tenn * 10) + target;
}
printf("数据的合成不确定度修约为:%.*lf\n", y, target);
double xx = target * 2;
printf("测量结果的完整表示为:x=%lf±%.*lf\n", av, y, xx);
}
printf("\n");
}
int main()
{
printf("所有不确定度均保留了9位小数,请自己进行修约\n");
printf("请输入数据的个数(0-10个):");
int n;
double input, arr[10], delta;
scanf_s("%d", &n);
for (int i = 0; i <= n-1; i++)
{
printf("请输入第%d个数据:", i+1);
scanf_s("%lf",&input);
arr[i] = input;
}
double av=Average(arr, n);
double ua = Ua(arr, n, av);
printf("请输入Δ仪(注意统一单位):");
scanf_s("%lf", &delta);
double ub = delta / (sqrt(3));
printf("B类不确定度为:%.9f\n", ub);
double x = (ua * ua) + (ub * ub);
double ux = sqrt(x);
printf("数据的合成不确定度为:%.9f\n", ux);
double eu = (ux / av) * 100;
printf("数据的相对不确定度为:%.9f%%\n", eu);
xiu(ux,av);
printf("注:修约可能有误,请自己检查一下。\n提示:对于合成不确定度和相对不确定度,当数据的首位非零数字大于或等于三时,\n取一位有效数字;当数据的首位数字小于三时,取两位有效数字。且数据保留只进位,不舍位的原则\n");
system("pause");
return 0;
}
当然,自己写的时候,太乱了,自己输入数据实验了几遍,暂时还没有发现哪里有问题,写完还是很有成就感的。以后还是要多用代码来解决问题。
在Visual Studio 2022里面把C语言代码编译成.exe可执行文件会更方便,具体怎么做可以问度娘。