明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3331|回复: 3

[求助]哪位大侠知道曲线拟合的源程序??

[复制链接]
发表于 2003-11-12 09:23:00 | 显示全部楼层 |阅读模式
我想知道怎么样拟合一个曲线,就是给一组数据(xi,yi)求出直线、多项式、乘幂等曲线的方程式。还望各位大侠多多指教。
发表于 2003-12-2 15:03:00 | 显示全部楼层
找本数值方法(机械工业出版社的浙大出的就可以)
发表于 2003-12-2 20:56:00 | 显示全部楼层
这是几年前写的一个东东,应该能满足你的需要,稍做修改还能实现更强大的函数曲线的绘制。

;   DRAW.LSP by XBBCAD
;运行环境:AutoCAD R12或以上版本
;程序一:绘制一元函数曲线
(defun C:DW(/ x x1 x2 n y p1 p2 xdis b osm)

  (setq s (getstring T  "输入一元函数表达式(以x为X坐标自变量):"))
  (if (/= s "") (setq dwexp s))
  (princ (strcat "现在的表达式是-> " dwexp "\n"))

  (setq x1 (getreal  "X起始坐标="))  
  (setq x2 (getreal  "X终点坐标="))
  (setq n (getint  "区间数量n="))

  (setq x x1)
  (setq xdis (/ (- x2 x1) n)) ;计算步长
  (setq p1 (list x (cal dwexp))) ;起点坐标
  (setq b (ssadd)) ;初始化选择集

  (setq osm (getvar "OSMODE"));保存OSNAP模式
  (setvar "OSMODE" 0); 关闭OSNAP模式
  
  (repeat n
    (progn
      (setq x (+ x xdis)) ;x坐标增量
      (setq y (cal dwexp)) ;计算y坐标
      (setq p2 (list x y)) ;下一点
      (command "LINE" p1 p2 "") ;绘制PLINE线
      (setq p1 p2) ;重设起点
      (ssadd (entlast) b) ;加入选择集
    );end progn
  );end repeat

  (command "EDIT" (entlast) "j" b "" "") ;连接成一条PLINE线
  (setvar "OSMODE" osm);恢复OSNAP模式
  
  (princ "\nDraw end.\n")
  (princ)

);end DW.

;程序二:绘制极坐标函数曲线
(defun C:PW(/ x x1 x2 n p1 p2 xdis len b osm)

  (setq s (getstring T "输入极坐标函数式(以x为极角自变量): "))
  (if (/= s "") (setq polarexp s))

  (princ (strcat "现在的表达式是-> " polarexp "\n"))

  (setq x1 (getreal  "起始角="))
  (setq x2 (getreal  "终止角="))
  (setq n (getint  "区间数量n="))

  (setq basepoint (getpoint  "输入基点<0,0> :"))
  (if (null basepoint) (setq basepoint '(0 0)))

  (setq x x1 len 0.0)
  (setq xdis (/ (- x2 x1) n)) ;计算极角的增量
  (setq len (cal polarexp))
  (setq p1 (polar basepoint x len));起点
  (setq b (ssadd)) ;初始化选择集

  (setq osm (getvar "OSMODE")) ;保存OSNAP模式
  (setvar "OSMODE" 0) ;关闭OSNAP模式

  (repeat n
   (progn
     (setq x (+ x xdis)) ;极角增量
     (setq len (cal polarexp)) ;计算极径
     (setq p2 (polar basepoint x len)) ;下一点坐标
     (command "LINE" p1 p2 "") ;绘制PLINE线
     (setq p1 p2) ;重设起点
     (ssadd (entlast) b) ;加入选择集
   );end progn
  );end repeat

  (command "EDIT" (entlast) "j" b "" "") ; 连接成一条PLINE线
  (setvar "OSMODE" osm) ;恢复目标捕捉模式

  (princ "\nDraw end.\n")
  (princ)

);end PW.
发表于 2003-12-29 17:17:00 | 显示全部楼层
我这有个用VC写的读ASCII文件,绘二次样条曲线的程序,看你需要吗?
void CTttView::OnDraw(CDC* pDC)
{
        if(flag==1)
        {
                pDC->SetMapMode (MM_LOMETRIC);
                pDC->SetWindowOrg (-150,1700);

                pDC->MoveTo (0,0);
                pDC->LineTo (0,1500);
                pDC->LineTo (-35,1455);
                pDC->MoveTo (0,1500);
                pDC->LineTo (35,1455);
                pDC->MoveTo (0,0);
                pDC->LineTo (2000,0);//DRAW X AXIS       
                pDC->LineTo (1955,35);
                pDC->MoveTo (2000,0);
                pDC->LineTo (1955,-35);//DRAW X AXIS
       
                pDC->TextOut (-50,1450,"Y");
                pDC->TextOut (-50,-50,"(0,0)");
                pDC->TextOut (2000,-50,"X");

                pDC->Ellipse (x[0]-10,y[0]-10,x[0]+10,y[0]+10);
                for(int i=1;i<10;i++)
                {
                        pDC->Ellipse (x-10,y-10,x+10,y+10);
                }
                CSe pse;
                double step=10;
                double sx=x[0]-step;
                double sy=pse.calstart (x[0],y[0],x[1],y[1],step);
                double ex=x[9]+step;
                double ey=pse.calend (x[8],y[8],x[9],y[9],step);
               
                CCal pcal;
                double tstep;
                double tx[11],ty[11];
                i=0;
                for(tstep=0.0;tstep<=1.0;tstep=tstep+0.1)
                {
                        pcal.input (sx,sy,x[0],y[0],x[1],y[1],x[2],y[2],tstep);
                        tx=pcal.calpx ();
                        ty=pcal.calpy ();
                        i++;
                }
                pDC->MoveTo (x[0],y[0]);
                for(i=1;i<=10;i++)
                {
                        if((tx-floor(tx))>=0.5)
                        {
                                tx=ceil(tx);
                        }
                        else
                        {
                                tx=floor(tx);
                        }
                        if((ty-floor(ty))>=0.5)
                        {
                                ty=ceil(ty);
                        }
                        else
                        {
                                ty=floor(ty);
                        }
                        pDC->LineTo ((int)(tx),(int)(ty));               
                }
                for(int j=1;j<=7;j++)
                {
                        i=0;
                        for(tstep=0.0;tstep<1.0;tstep=tstep+0.1)
                        {
                                pcal.input (x[j-1],y[j-1],x[j],y[j],x[j+1],y[j+1],x[j+2],y[j+2],tstep);
                                tx=pcal.calpx ();
                                ty=pcal.calpy ();
                                i++;
                        }
                        pDC->MoveTo (x[j],y[j]);
                        for(i=1;i<=10;i++)
                        {
                                if((tx-floor(tx))>=0.5)
                                {
                                        tx=ceil(tx);
                                }
                                else
                                {
                                        tx=floor(tx);
                                }
                                if((ty-floor(ty))>=0.5)
                                {
                                        ty=ceil(ty);
                                }
                                else
                                {
                                        ty=floor(ty);
                                }
                                pDC->LineTo ((int)(tx),(int)(ty));                       
                        }
                }
                i=0;
                for(tstep=0.0;tstep<1.0;tstep=tstep+0.1)
                {
                        pcal.input (x[7],y[7],x[8],y[8],x[9],y[9],ex,ey,tstep);
                        tx=pcal.calpx ();
                        ty=pcal.calpy ();
                        i++;
                }
                pDC->MoveTo (x[8],y[8]);
                for(i=1;i<=10;i++)
                {
                        if((tx-floor(tx))>=0.5)
                        {
                                tx=ceil(tx);
                        }
                        else
                        {
                                tx=floor(tx);
                        }
                        if((ty-floor(ty))>=0.5)
                        {
                                ty=ceil(ty);
                        }
                        else
                        {
                                ty=floor(ty);
                        }
                        pDC->LineTo ((int)(tx),(int)(ty));               
                }
        }
}
///////////////////////////
void CTttView::OnFileOpen()
{
        CFileDialog input(TRUE);
        CString filename;
        FILE *fp;
        float dx[10],dy[10];
        if(input.DoModal ()!= IDOK)
                return;
        filename=input.GetPathName ();
        if((fp=fopen(filename,"r++"))==NULL)
        {
                MessageBox("Failed");
                return;
        }
        for(int i=0;i<=9;i++)
        {               
                fscanf(fp,"%f,%f;",&dx,&dy);
        }
//////////////////////////////////////////////////////////////////////////////
        for(i=0;i<10;i++)
        {
                if((dx-floor(dx))>=0.5)
                {
                        x=(int)(150*dx+1);
                }
                else
                {
                        x=(int)(150*dx-1);
                }
                if((dy-floor(dy))>=0.5)
                {
                        y=(int)(10*dy+1);
                }
                else
                {
                        y=(int)(10*dy-1);
                }
        }

        flag=1;
        Invalidate(TRUE);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 00:49 , Processed in 0.176991 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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