// ErrorEvaluation
/*
------------------------------------------------------
作者   : Black Ghost
日期   : 2018-12-23
版本   : 0.0.0
------------------------------------------------------
    误差估计方法
理论：
    0 最大误差：
    E = max(Abs(f(xk)-y(xk)))

    1 平均误差：
         1   N
    E = --- Sum (Abs(f(xk)-y(xk)))
         N  k=1

    2 均方根误差：
              1
    E = Sqrt(--- Sum (f(xk)-y(xk))^2)
              N

    参考：John H. Mathews and Kurtis D. Fink. Numerical
         methods using MATLAB, 4th ed. Pearson
         Education, 2004. pp. 196
------------------------------------------------------
输入   :
    FY      数据对，nx2，f(xk)---y(xk)
输出   :
    sol     误差结果
------------------------------------------------------
*/

package goNum

import (
	"math"
)

// MaxError 最大误差
func MaxError(FY Matrix) float64 {
	//最大误差
	//判断FY的维数
	if FY.Columns < 2 {
		panic("Error in goNum.MaxError: FY is at least 2 columns")
	}

	errs := ZeroMatrix(FY.Rows, 1)
	var maxE float64
	for i := 0; i < FY.Rows; i++ {
		errs.Data[i] = math.Abs(FY.GetFromMatrix(i, 1) - FY.GetFromMatrix(i, 0))
	}
	maxE, _, _ = Max(errs.Data)
	return maxE
}

// MeanError 平均误差
func MeanError(FY Matrix) float64 {
	//平均误差
	//判断FY的维数
	if FY.Columns < 2 {
		panic("Error in goNum.MaxError: FY is at least 2 columns")
	}

	var meanE float64
	for i := 0; i < FY.Rows; i++ {
		meanE += math.Abs(FY.GetFromMatrix(i, 1) - FY.GetFromMatrix(i, 0))
	}
	meanE = meanE / float64(FY.Rows)
	return meanE
}

// RMSError 均方根误差
func RMSError(FY Matrix) float64 {
	//均方根误差
	//判断FY的维数
	if FY.Columns < 2 {
		panic("Error in goNum.MaxError: FY is at least 2 columns")
	}

	var rmsE float64
	for i := 0; i < FY.Rows; i++ {
		temp0 := FY.GetFromMatrix(i, 1) - FY.GetFromMatrix(i, 0)
		rmsE += temp0 * temp0
	}
	rmsE = math.Sqrt(rmsE / float64(FY.Rows))
	return rmsE
}
