马上注册,享受更多特权
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
已知输入:X,输出:Y,共有5组采样标本数据的情况下(5组可以按实际情况增减,程序中对应数组范围:ArrRange),推算出直线公式:Y:=bX+a,b和a通过样本数据计算得出全局常量变量声明:
VAR_GLOBAL CONSTANT
ArrRange:UINT:=5;//数组大小设置
END_VAR
功能块变量声明:
VAR_INPUT
X :ARRAY [1..ArrRange] OF REAL;//数组范围在全局变量设置
Y :ARRAY [1..ArrRange] OF REAL;
X_In:REAL;
END_VAR
VAR_OUTPUT
Y_Out:REAL;
END_VAR
VAR
X_SIZE:UINT;
X_ArrRange:UINT;
i: INT;
X_Mean:REAL;//X平均
Y_Mean:REAL;//Y平均
XY_Product: REAL;//Xi* Yi
X_Square:REAL;
a:REAL;
b:REAL;
bStart: BOOL;
Variance: REAL;// 方差验证,越小越好
END_VAR
程序:
// SizeOfAry(in:=x,out=>X_SIZE);//用该函数能自动计算数组范围
// AryMean(In:=X[1], Size:=X_SIZE, Out:=X_Mean );//该函数能自动累加数组,然后平均值
//每次计算前,全部清零
Variance:=0;
XY_Product:=0;
X_Square:=0;
//开始计算
AryMean(In:=X[1], Size:=ArrRange, Out:=X_Mean );//X数组平均值计算
AryMean(In:=Y[1], Size:=ArrRange, Out:=Y_Mean );//Y数组平均值计算
FOR i:=1 TO UINT_TO_INT(ArrRange) DO
XY_Product:=X*Y+XY_Product;//Xi* Yi累加
END_FOR
FOR i:=1 TO UINT_TO_INT(ArrRange) DO
X_Square:=X*X+X_Square;//Xi平方累加
END_FOR
//结果
b:=(XY_Product-ArrRange*X_Mean*Y_Mean)/(X_Square-ArrRange*X_Mean*X_Mean);//斜率
a:=Y_Mean-b*X_Mean;//常量
//均方差显示
FOR i:=1 TO UINT_TO_INT(ArrRange) DO
Variance:=(b*X+a-Y)*(b*X+a-Y)+Variance;//Y-Yi平方,累加
END_FOR
Variance:=SQRT(Variance);//开平方,最终得出均方差,网上说小于2,代表该直线合理,大于2则不适合用该直线拟合公式,试试用曲线拟合公式
//曲线公式,X_In为输入值,Y_Out为输出结果
Y_Out:=b*X_In+a;
|