C# 4 阶曲线拟合不匹配

问题描述

在使用了一些与某种 polyfit 相关的代码后,我没有获得我想要的成功。我有一些数据点总是从 0,0 开始,以 1,1 结束。所以我总是应该有一个看起来像这样的功能:hx^4 + ix^3 + jx^2 + kx。要检查函数是否正确,系数的总和应为 1。使用 Excel 与这些数据点和趋势线给我这个功能:

y = -1,1094x^4 + 2,7022x^3 - 0,8903x^2 + 0,3024x.

无论我尝试什么,我都无法通过 C# 函数获得这些值。这些是用于获得上述函数的数据点。

var x = new[] { 0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 };
var y = new[] { 0.0,0.364,0.499,0.596,0.676,0.746,0.853,0.901,0.949,1.0 };
int order = 4;

我使用的所有函数得到的结果都是一样的:

x0   0,01647552447552759
x1   3,8548543123542967
x2   -8,747231934731909
x3   9,791958041958022
x4   -3,92482517482517
sum  0,9912307692307674

在图表中比较这些时,它们彼此之间绝不接近。有人知道使用什么方法、代码或库从某种 polyfit 中获取正确的函数吗?

用于获取这些值的代码:

public static double[] Polyfit(double[] x,double[] y,int degree)
        {           
var v = new DenseMatrix(x.Length,degree + 1);
for (int i = 0; i < v.RowCount; i++)
for (int j = 0; j <= degree; j++) v[i,j] = Math.Pow(x[i],j);
var yv = new DenseVector(y).ToColumnMatrix();
QR<double> qr = v.QR();
// Math.Net doesn't have an "economy" QR,so:
// cut R short to square upper triangle,then recompute Q
var r = qr.R.SubMatrix(0,degree + 1,degree + 1);
var q = v.Multiply(r.Inverse());
var p = r.Inverse().Multiply(q.TransposeThisAndMultiply(yv));
return p.Column(0).ToArray();
}

我使用的另一个是这个:

var x = new[] { 0.0,1.0 };
int order = 4;
var design = Matrix<double>.Build.Dense(x.Length,order + 1,(i,j) => Math.Pow(x[i],j));
double[] p = MultipleRegression.QR(design,Vector<double>.Build.Dense(y)).ToArray();

最后一个使用的是:

double[] p = Fit.Polynomial(x,y,order);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...