小妹在线高分求:已知N个(x,y)点,求满足最小二乘方拟合曲线的指数方程y=c*ebx(bx是e的指数),即 求c 和 b 常数值的程序或者方法!

yxh1214 2004-10-19 12:50:16
已知x1,x2,x3...取值y1,y2,y3,...
求满足最小二乘方拟合曲线的指数方程y=c*ebx(bx是e的指数),即 求c 和 b 常数的值程序和算法..

...全文
421 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxh1214 2004-10-28
  • 打赏
  • 举报
回复
谢谢51flyou和zzWU,我已经解决了,以下是用ORACLE函数实现求A\B值和R值的..

CREATE OR REPLACE FUNCTION F_DJL
(
P_KFDW VARCHAR2,
P_ND VARCHAR2,
p_KSYD NUMBER,
p_ZZYD NUMBER)RETURN VARCHAR2
IS
V_HGFW VARCHAR(6);--回归范围
V_1 NUMBER;--∑[Xi*ln(Yi)]
V_2 NUMBER;--∑Xi
V_3 NUMBER;--∑ln(Yi)
V_4 NUMBER;--∑Xi^2
V_A NUMBER;
V_B NUMBER;
V_R NUMBER;--R^2=V_SSR/(V_SSR+V_SSE)
V_R1 NUMBER;
V_SSR NUMBER;
V_SSE NUMBER;
V_LNY NUMBER;
V_KSNY VARCHAR2(6);
V_ZZNY VARCHAR2(6);
V_X NUMBER;
V_Y NUMBER;
CURSOR RS IS
SELECT TO_NUMBER(SUBSTR(NY,5,2)) ,ZRSP FROM AYC01
where NY>=V_KSNY AND NY<=V_ZZNY AND AYC01.Kfdy=P_KFDW AND ZRSP IS NOT NULL;
BEGIN
V_1:=0;
V_2:=0;
V_3:=0;
V_4:=0;
V_SSR:=0;
V_SSE:=0;
V_R1:=0;
V_R:=0;

V_HGFW:=p_KSYD||'-'||p_ZZYD;--回归范围,如1-7
IF P_KSYD<9 THEN
V_KSNY:=P_ND||'0'||P_KSYD ;
ELSE
V_KSNY:=P_ND||P_KSYD ;
END IF;

IF P_ZZYD<9 THEN
V_ZZNY:=P_ND||'0'||P_ZZYD;
ELSE
V_ZZNY:=P_ND||P_ZZYD;
END IF;

IF F_GETROWS('SELECT COUNT(*) FROM AYC01 where NY>='||V_KSNY||' AND NY<='||V_ZZNY||
' AND AYC01.Kfdy='''||P_KFDW||''' AND ZRSP IS NOT NULL')>0 THEN

--计算A、B的值
OPEN RS;
FETCH RS INTO V_X,V_Y ;
WHILE RS%FOUND LOOP
BEGIN
V_1:=V_1 + V_X * LN(V_Y);
V_2:=V_2 + V_X ;
V_3:=V_3 + LN(V_Y);
V_4:=V_4 + V_X * V_X;
END;
FETCH RS INTO V_X,V_Y;
END LOOP;
IF (V_4 - (V_2 * V_2)) <>0 THEN
V_B:=(V_1- (V_2 * V_3)/RS%ROWCOUNT)/(V_4 - (V_2 * V_2)/RS%ROWCOUNT);
V_A:=EXP(V_3/RS%ROWCOUNT - V_B*V_2/RS%ROWCOUNT);
V_LNY:=V_3/RS%ROWCOUNT;
ELSE
INSERT INTO AYC07(RQ,XH,SFMC,BM,DW,SM)
VALUES(SYSDATE,'2','INSERT_AYC02','AYC02',P_KFDW,P_ND||'年'||V_HGFW||'月,计算递减率时,分母为零。。');
COMMIT;
END IF;

CLOSE RS ;

OPEN RS;
FETCH RS INTO V_X,V_Y ;
WHILE RS%FOUND LOOP
BEGIN
V_R1:=LN(V_A) + V_B * V_X;
V_SSR:=V_SSR + (V_R1 - V_LNY) *(V_R1 - V_LNY);
V_SSE:= V_SSE + (LN(V_Y) - V_R1 )* (LN(V_Y) - V_R1 ) ;
END;
FETCH RS INTO V_X,V_Y;
END LOOP;
IF V_SSR+V_SSE<>0 THEN
V_R:=SQRT(V_SSR/(V_SSR+V_SSE));
END IF;
IF V_R<>0 AND V_A<>0 AND V_B<>0 THEN
return '1';
ESLE
return '0';
END IF;
END IF;
END;

结贴了..
51flyou 2004-10-19
  • 打赏
  • 举报
回复
//最小二乘法
void pcir(double X[],double Y[],double A[],int N,int M,double &DT1,double &DT2,double &DT3)
{
// X[] Y[] 使需要拟合的点,A[]时拟合曲线的系数,
double S[21],T[21],B[21];
double Z,D1,P,C,D2,G,Q,DT;
int i,j,jk;
for(i=1;i<=M;i++)// DO 5 i=1,M
{
A[i]=0.0;
}

if (M>=N) M=N;
if (M>=20) M=20;
Z=0.0;
/* for(i=1;i<=N;i++)//DO 10 i=1,N
{
Z=Z+X[i]/N;
}//10 Z=Z+X(i)/N*/
B[1]=1.0;
D1=N;
P=0.0;
C=0.0;
for(i=1;i<=N;i++)
{
P=P+(X[i]-Z);
C=C+Y[i];
}
C=C/D1;
P=P/D1;
A[1]=C*B[1];
if(M>1)
{
T[2]=1.0;
T[1]=-P;
D2=0.0;
C=0.0;
G=0.0;
for(i=1;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[2]=C*T[2];
A[1]=C*T[1]+A[1];
}
for(j=3;j<=M;j++)
{
S[j]=T[j-1];
S[j-1]=-P*T[j-1]+T[j-2];
if(j>=4)
for(jk=j-2;jk>=2;jk--)
S[jk]=-P*T[jk]+T[jk-1]-Q*B[jk];
S[1]=-P*T[1]-Q*B[1];
D2=0.0;
C=0.0;
G=0.0;
for(i=1;i<=N;i++)
{
Q=S[j];
for(jk=j-1;jk>=1;jk--)
{
Q=Q*(X[i]-Z)+S[jk];
}
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(jk=j-1;jk>=1;jk--)
{
A[jk]=C*S[jk]+A[jk];
B[jk]=T[jk];
T[jk]=S[jk];
}
}
DT1=0.0;
DT2=0.0;
DT3=0.0;

for(i=1;i<=N;i++)
{
Q=A[M];
for(jk=M-1;jk>=1;jk--)
{
Q=Q*(X[i]-Z)+A[jk];
}
DT=Q-Y[i];
if (fabs(DT)>DT3) DT3=fabs(DT);
DT1=DT1+DT*DT;
DT2=DT2+fabs(DT);
}

//AfxMessageBox("hello");

}
zzwu 2004-10-19
  • 打赏
  • 举报
回复
指数曲线拟合可以化为线性拟合:

设已知(xi,yi),i=1,2…,N, 试作指数曲线拟合

y=c*exp(bx)

两边取对数
log y=log c + log(exp(bx))
=log c + bx

或 t = a + bx (1)
其中
t=log y (2)
a=log c (3)

由原来的(xi,yi),利用(2),可得(xi,ti),

然后再由(1),经线性拟合,可得a,b,

再由(3),可解出c, 这样c,b都得到了.



yxh1214 2004-10-19
  • 打赏
  • 举报
回复
在EXECEL里的图表里添加趋势线,就可以自动得到方程,
我想得到趋势线方程里的两个常量和R平方值,也不知道怎么从EXECEL动态画出的趋势线里取出这几个数据.

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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