C#最小二乘法曲线拟合

chenamo9651 2010-05-04 02:14:10
项目需要,要在C#里面实现最小二乘法,在网上找了一段C语言的代码,我把他转换成C#,实验的时候,得到的拟合方程除了最高指数位的系数正确以外,其余的都不正确,不知道错误在哪里。

我判断错误与否是通过Excel的趋势线得到的方程做比较的!

程序如下:
public class PirlFun
{

private double[] dt;
private double rdblAverageX;
public PirlFun()
{
rdblAverageX = 0;
dt = new double[3];
dt[0] = 0;
dt[1] = 0;
dt[2] = 0;
}
public double[] Dt
{
get
{
return dt;
}
}
public double RdblAverageX
{
get
{
return rdblAverageX;
}
}
public double[] Iapcir(double[] x, double[] y, int n, int m)
{

double[] a = new double[m];
double z, p, c, g, q, d1, d2;
double[] s = new double[19];
double[] t = new double[19];
double[] b = new double[19];

for (int i = 0; i < m; i++)
{
a[i] = 0;
}

if (m > n)
m = n;
if (m > 20)
m = 20;
z = 0;
for (int i = 0; i < n; i++)
{
rdblAverageX = rdblAverageX + x[i];
z = z + x[i] / (1 * n);
}
rdblAverageX = rdblAverageX / n;
b[0] = 1;
d1 = 1 * n;
p = 0;
c = 0;
q = 0;
for (int i = 0; i < n; i++)
{
p = p + (x[i] - z);
c = c + y[i];
}
c = c / d1;
p = p / d1;
a[0] = c * b[0];
if (m > 1)
{
t[1] = 1;
t[0] = (-1) * p;
d2 = 0;
c = 0;
g = 0;
for (int i = 0; i < n; i++)
{
q = x[i] - z - p;
d2 = d2 + q * q;
c = c + y[i] * q;
g = g + (x[i] - z) * q * q;
}
c = c / d2;
p = g / d2;
q = d2 / d1;
d1 = d2;
a[1] = c * t[1];
a[0] = c * t[0] + a[0];
}
for (int j = 2; j < m; j++)
{

s[j] = t[j - 1];
s[j - 1] = (-1) * p * t[j - 1] + t[j - 2];
if (j >= 3)
{
for (int k = j - 2; k > 0; k--)///////
{
s[k] = (-1) * p * t[k] + t[k - 1] - q * b[k];
}
}
s[0] = (-1) * p * t[0] - q * b[0];
d2 = 0;
c = 0;
g = 0;
for (int i = 0; i < n; i++)
{
q = s[j];
for (int k = j - 1; k >= 0; k--)
{
q = q * (x[i] - z) + s[k];
}
d2 = d2 + q * q;
c = c + y[i] * q;
g = g + (x[i] - z) * q * q;
}

c = c / d2;
p = g / d2;
q = d2 / d1;
d1 = d2;
a[j] = c * s[j];
t[j] = s[j];
for (int k = j - 1; k >= 0; k--)
{
a[k] = c * s[k] + a[k];
b[k] = t[k];
t[k] = s[k];
}

}

for (int i = 0; i < n; i++)
{
q = a[m - 1];
for (int k = m - 2; k >= 0; k--)
{
q = a[k] + q * (x[i] - z);
}
p = q - y[i];
if (Math.Abs(p) > dt[2])
dt[2] = Math.Abs(p);
dt[0] = dt[0] + p * p;
dt[1] = dt[1] + Math.Abs(p);

}
return a;
}
}
...全文
1384 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cj2828 2012-02-19
  • 打赏
  • 举报
回复
能帖一个完整的吗?
chenamo9651 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skyning 的回复:]

引用 8 楼 chenamo9651 的回复:

引用 7 楼 sfjxgc 的回复:

我也碰到了同样的问题,徐士良写的那本数值分析书中的源代码仅能对得上最高次,我在excel中比较过,请教各位这是什么问题?


我在同济大学的bbs上下载了一个算法,很好用,问题解决了!


你好,请问是哪个算法啊?
能不能介绍一下啊。
[/Quote]



文档齐全,代码规范的开源数值分析类库ALGLIB(详见http://www.alglib.net/)
skyning 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenamo9651 的回复:]

引用 7 楼 sfjxgc 的回复:

我也碰到了同样的问题,徐士良写的那本数值分析书中的源代码仅能对得上最高次,我在excel中比较过,请教各位这是什么问题?


我在同济大学的bbs上下载了一个算法,很好用,问题解决了!
[/Quote]

你好,请问是哪个算法啊?
能不能介绍一下啊。
chenamo9651 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sfjxgc 的回复:]

我也碰到了同样的问题,徐士良写的那本数值分析书中的源代码仅能对得上最高次,我在excel中比较过,请教各位这是什么问题?
[/Quote]

我在同济大学的bbs上下载了一个算法,很好用,问题解决了!
sfjxgc 2011-08-13
  • 打赏
  • 举报
回复
我也碰到了同样的问题,徐士良写的那本数值分析书中的源代码仅能对得上最高次,我在excel中比较过,请教各位这是什么问题?
jingkunliu 2010-06-24
  • 打赏
  • 举报
回复
我也想实现这个功能,学习一下
pm_854537719 2010-06-24
  • 打赏
  • 举报
回复
能注释下不?不然不好看懂啊
mngzilin 2010-05-04
  • 打赏
  • 举报
回复
我一般调用GDI的基数样条曲线函数
walkghost 2010-05-04
  • 打赏
  • 举报
回复
halsey117 2010-05-04
  • 打赏
  • 举报
回复
有人,qq:1259610625
chenamo9651 2010-05-04
  • 打赏
  • 举报
回复
没有人做够这个东东吗?

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧