本帖最后由 lilijin1995 于 2023-6-12 10:28 编辑
1. 背景:已知三个点用C语言实现求解一元二次方程的系数;进入传感器行业已经即将2个多月了;在标定传感器中经常需要拟合一条曲线,
而大部分传感器拟合出来的都是一元二次方程的特性曲线;我们经常需要确定三个点:
零点:相对干净的环境中读值为0所对应的AD;
高浓度点:高浓度所对应的AD;
低浓度点:低浓度所对应的AD;
三个点驱动一条曲线。
2.拟合曲线的方法:
(1)用EXCEL拟合:
(2)MATLAB拟合;
(3)ChatGPT帮你写算法;
EXCEL拟合比较简单,MATLAB我不会,于是想到了ChatGPT;
看不清的话我插入代码:
#include <stdio.h>
void solveQuadraticEquation(float x1, float y1, float x2, float y2, float x3, float y3, float *a, float *b, float *c) {
float denom = (x1 - x2) * (x1 - x3) * (x2 - x3);
*a = (y1 / ((x1 - x2) * (x1 - x3))) + (y2 / ((x2 - x1) * (x2 - x3))) + (y3 / ((x3 - x1) * (x3 - x2)));
*b = (-y1 * (x2 + x3) / ((x1 - x2) * (x1 - x3))) - (y2 * (x1 + x3) / ((x2 - x1) * (x2 - x3))) - (y3 * (x1 + x2) / ((x3 - x1) * (x3 - x2)));
*c = (y1 * x2 * x3 / ((x1 - x2) * (x1 - x3))) + (y2 * x1 * x3 / ((x2 - x1) * (x2 - x3))) + (y3 * x1 * x2 / ((x3 - x1) * (x3 - x2)));
}
int main() {
float x1, y1, x2, y2, x3, y3;
float a, b, c;
// 输入三个点的坐标
printf("请输入第一个点的坐标(x1, y1): ");
scanf("%f %f", &x1, &y1);
printf("请输入第二个点的坐标(x2, y2): ");
scanf("%f %f", &x2, &y2);
printf("请输入第三个点的坐标(x3, y3): ");
scanf("%f %f", &x3, &y3);
// 求解一元二次方程的系数
solveQuadraticEquation(x1, y1, x2, y2, x3, y3, &a, &b, &c);
// 打印结果
printf("一元二次方程的系数:\n");
printf("a = %.2f\n", a);
printf("b = %.2f\n", b);
printf("c = %.2f\n", c);
return 0;
}
3. 验证流程:
打开以下C在线编译器:https://www.w3cschool.cn/tryrun/runcode?lang=c-clang
粘贴上面的代码:
假设曲线方程是y=X^2+X,则系数为a=1,b=1,c=0;所以(0,0),(1,2),(2,6)是曲线方程上的三个点;把这三个点输入
点上面编译器的输入,分别输入001226,间隔加回车或空格;编译运行后可得
与预想的a=1,b=1,c=0一致;up主有验证了两三个曲线方程,但这个算法试用范围和一般性还有待验证,毕竟是AI生成的代码,有错误是常见的。
|