找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 933|回复: 4

[求助] [求助]:有没有熟悉最小二乘法(曲线拟合)

[复制链接]
发表于 2005-8-26 13:06:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我需要一个曲线拟合的方法
找到一个vc的程序,求那位高手帮忙转成lisp


//最小二乘法曲线拟合
[PHP]
typedef CArray<double,double>CDoubleArray;
BOOL CalculateCurveParameter(CDoubleArray *X,CDoubleArray *Y,long M,long N,CDoubleArray *A)
{
//X,Y -- X,Y两轴的坐标
//M -- 结果变量组数
//N -- 采样数目
//A -- 结果参数

register long 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)=0;
Z=0;
B[0]=1;
D1=N;
P=0;
C=0;
for(i=0;i<N;i++)
{
P=P+(*X)-Z;
C=C+(*Y);
}
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)-Z-P;
D2=D2+Q*Q;
C=(*Y)*Q+C;
G=((*X)-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)-Z)+S[k];
D2=D2+Q*Q;
C=(*Y)*Q+C;
G=((*X)-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];
}
}
return TRUE;
}
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-29 07:17:51 | 显示全部楼层
search "least square autolisp" in google
得到如下一个程序
http://new.cadalyst.com/code/browseyear.cfm?fullyear=2001
Best-fit Line by Jorn Anke, p.74
AutoLISP routine calculates (using the least-square method) and draws the line that fits best between two selected points.

它是选点,画直线,不知道和你要求的曲线有没有太多的差别,不过可以参考一下:)
;Tip1677:  LIN.LSP   Best-fit Line   (c)2001, Jorn Anke

; PURPOSE: You can select several points and the routine will calculate (using
;          Least Square Method) the line that fits best between the points, and
;          then draw  the line.

(defun
     C:LIN ()
(print)
  (setq SVAR (getstring
               "Do you vant to select points or objects? (P/O) <O> ?"
             ) ;_ end of getstring
  ) ;_ end of setq

  (setq SVAR (strcase SVAR))
  (setq X 0)
  (setq I 0)
  (setq SX 0)
  (setq SY 0)
  (setq SXY 0)
  (setq SX2 0)
  (if (= SVAR "P")
    (progn ; Svar = Points
      (while X ; while X <> nil, e.g. X has got a value
        (setq PUNKT (getpoint "Select point, <Return> to end ..."))
        (princ "\n")
        (setq X (car PUNKT))
        (setq Y (cadr PUNKT))
        (if X
; if X <> nil, e.g. X has got a value, <Enter> not pressed
          (progn
            (setq SX (+ SX X))
            (setq SY (+ SY Y))
            (setq SXY (+ SXY (* X Y)))
            (setq SX2 (+ SX2 (* X X)))
            (if (= I 0)
              (progn
                (setq XMIN X)
                (setq XMAX X)
              ) ;_ end of progn
            ) ;_ end of if
            (if (> XMIN X)
              (setq XMIN X)
            ) ;_ end of if
            (if (< XMAX X)
              (setq XMAX X)
            ) ;_ end of if
            (setq I (+ I 1))
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of while
    ) ;_ end of progn
    (progn ; Svar = Objects
      (setq LISTE (ssget))
      (setq LISTELENGDE (sslength LISTE))
      (while (<= I (- LISTELENGDE 1))
        (setq ELEMENT (entget (ssname LISTE I)))
        (setq X (cadr (assoc 10 ELEMENT)))
        (setq Y (caddr (assoc 10 ELEMENT)))
        (setq SX (+ SX X))
        (setq SY (+ SY Y))
        (setq SXY (+ SXY (* X Y)))
        (setq SX2 (+ SX2 (* X X)))
        (if (= I 0)
          (progn
            (setq XMIN X)
            (setq XMAX X)
          ) ;_ end of progn
        ) ;_ end of if
        (if (> XMIN X)
          (setq XMIN X)
        ) ;_ end of if
        (if (< XMAX X)
          (setq XMAX X)
        ) ;_ end of if
        (setq I (+ I 1))
      ) ;_ end of while
    ) ;_ end of progn
  ) ;_ end of if
  (setq A (/ (- SXY (/ (* SX SY) I)) (- SX2 (/ (* SX SX) I))))
  (setq B (- (/ SY I) (* A (/ SX I))))
  (setq X1 XMIN)
  (setq Y1 (+ (* A X1) B))
  (setq X2 XMAX)
  (setq Y2 (+ (* A X2) B))
  (command "line" (list X1 Y1) (list X2 Y2) "")
) ;_ end of defun
;***** END RUTINE: LIN
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-29 22:36:42 | 显示全部楼层
看不出这个程序做了些什么?
真是不好意思
每次好像都是在两点间花了一条直线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 15:06:37 | 显示全部楼层
最小二乘法的最简单例子就是对一堆离散点x,y,确定y=kx+b的方程啊
不过也没有时间能好好的阅读你的c代码,不好意思的了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 18:04:52 | 显示全部楼层
最小二乘法的原理就是使计算值与真值差值的平方和最小.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 12:44 , Processed in 0.182027 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表