急求最小二乘法算法程序

adashm 2005-04-20 09:14:52
我要对二元一次方程y=ax1+bx2进行a,b系数估计,谁能给出源程序,急等
...全文
143 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldiqing 2005-04-24
  • 打赏
  • 举报
回复
我给你吧
#include "math.h"
//x[]是x坐标数组,y[]是y坐标数组,n是数据点个数,a[]你和结果,即多项式的系数数组;
//m为拟合阶数。
void iapcir(double x[],double y[],int n,double a[],int m,double dt[])
{ int i,j,k;
double z,p,c,g,q,d1,d2,s[20],t[20],b[20];
for (i=0; i<=m-1; i++) a[i]=0.0;
if (m>n) m=n;
if (m>20) m=20;
z=0.0;
for (i=0; i<=n-1; i++) z=z+x[i]/(1.0*n);
b[0]=1.0; d1=1.0*n; p=0.0; c=0.0;
for (i=0; i<=n-1; 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.0; t[0]=-p;
d2=0.0; c=0.0; g=0.0;
for (i=0; i<=n-1; 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 (j=2; j<=m-1; j++)
{ s[j]=t[j-1];
s[j-1]=-p*t[j-1]+t[j-2];
if (j>=3)
for (k=j-2; k>=1; k--)
s[k]=-p*t[k]+t[k-1]-q*b[k];
s[0]=-p*t[0]-q*b[0];
d2=0.0; c=0.0; g=0.0;
for (i=0; i<=n-1; i++)
{ q=s[j];
for (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 (k=j-1; k>=0; k--)
{ a[k]=c*s[k]+a[k];
b[k]=t[k]; t[k]=s[k];
}
}
dt[0]=0.0; dt[1]=0.0; dt[2]=0.0;
for (i=0; i<=n-1; i++)
{ q=a[m-1];
for (k=m-2; k>=0; k--)
q=a[k]+q*(x[i]-z);
p=q-y[i];
if (fabs(p)>dt[2]) dt[2]=fabs(p);
dt[0]=dt[0]+p*p;
dt[1]=dt[1]+fabs(p);
}
return;
}
dfyang 2005-04-24
  • 打赏
  • 举报
回复
这个可做曲线拟合,你将M设成2就是直线了
多维数组不行
adashm 2005-04-24
  • 打赏
  • 举报
回复
我还是不明白,这个能算多元的吗
adashm 2005-04-21
  • 打赏
  • 举报
回复
弱弱的问,CDoubleArray 可以是多维数组吗
adashm 2005-04-21
  • 打赏
  • 举报
回复
谢谢啊,我急着用,下次一定自己编,思路我有啊,可是这个部分今天就的完成,还有别的要做呢
Mycro 2005-04-21
  • 打赏
  • 举报
回复
对,给出思路就行了。。

这样,不好。。。

动手能力很重要。。
dfyang 2005-04-21
  • 打赏
  • 举报
回复
下不为例
typedef CArray<double,double> CDoubleArray;
fibbery 2005-04-21
  • 打赏
  • 举报
回复
bs楼上,把弟弟们都给惯坏了。给出思路就行了嘛!
dfyang 2005-04-21
  • 打赏
  • 举报
回复
呵呵,刚好有一个,就贴给你了:
void CDataBaseDoc::CalculateCurveParameter(CDoubleArray* X, CDoubleArray* Y, CDoubleArray* a, int M, int N)
{
//X,Y -- X,Y两轴的坐标
//M -- 结果变量组数
//N -- 采样数目
//a -- 结果参数

int i, j, k;
double Z, D1, D2, C, P, G, Q;
CDoubleArray B, T, S;
B.SetSize(N);
T.SetSize(N);
S.SetSize(N);
if(M > N) M = N;

for(i = 0; i < M; i++) (*a)[i]=0;
Z = 0;
B[0] = 1;
D1 = N;
P = 0;
C = 0;

for(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] = -P;
D2 = 0;
C = 0;
G = 0;
for(i = 0; i < N; i++)
{
Q = (*X)[i] - Z - P;
D2 = D2 + Q * Q;
C = (*Y)[i] * Q + C;
G = ((*X)[i]-Z) * Q * Q + G;
}

C = C / D2;
P = G / D2;
Q = D2 / D1;
D1 = D2;
(*a)[1] = C * T[1];
(*a)[0] = C* T[0] + (*a)[0];
}

for(j = 2; j < M; j++)
{
S[j] = T[j-1];
S[j-1] = -P * T[j-1] + T[j-2];
if(j >= 3)
{
for(k = j - 2; k >= 1; k--)
S[k] = -P * T[k] + T[k-1] - Q * B[k];
}

S[0] = -P * T[0] - Q * B[0];
D2 = 0;
C = 0;
G = 0;

for(i = 0; i < N; i++)
{
Q = S[j];
for(k = j - 1; k >= 0; k--)
Q = Q *((*X)[i]-Z) + S[k];
D2 =D2 + Q * Q;
C = (*Y)[i] * Q + C;
G = ((*X)[i] - Z) * Q * Q + G;
}

C =C / D2;
P =G / D2;
Q =D2 / D1;
D1 =D2;
(*a)[j] = C * S[j];
T[j] = S[j];

for(k = j - 1; k >= 0; k--)
{
(*a)[k] = C * S[k] + (*a)[k];
B[k] = T[k];
T[k] = S[k];
}
}
}
zengfancy 2005-04-20
  • 打赏
  • 举报
回复
告诉你一个算法:刚学过数值计算
y/x1 = a + b*(x2/x1) => m = a + b*n //m,n是小数数组
下面求解矩阵方程:
|sigma(1) sigma(n) | | a | | sigma(m) |
| | | | = | |
|sigma(n) sigma(n^2)| | b | | sigma(m*n) |

sigma是求和的意思,for example:
int m[5] = {1,2,3,4,5}, int n[5] = {6,7,8,9,10},
sigma(m)=15, sigma(n)=6+7+8+9+10

具体代码就不用我写了吧
Featured 2005-04-20
  • 打赏
  • 举报
回复
找本《数值计算》的书,光盘里面多半有这玩意

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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