线性最小二乘法,c++和c#

文章 3年前 (2021) admin
0

Q1:C++ 最小二乘法

#include#includedouble x[20],y[20],Save[20][20]={ 0 };int n,z;void Input() //输入x和y的多组数值{ cout "要输入的数据组数:";cinz for(int I=0;I=z-1;I){ cout " x " x[I];你好[我];}}void Calculate(int s,int n) //实验一的计算函数{ int i,j,r=s;保存[1][1]=z;for(I=0;I=z-1;I){ 0保存[1][2]=x[I];保存[1][3]=y[I];保存[2][1]=x[I];保存[2][2]=x[I]* x[I];保存[2][3]=x[I]* y[I];} cout "最小二乘法计算矩阵如下:"

Q2:最小二乘法的C++程序【y=A+B*e^(-x)】

为什么不想直接贴?

Q3:求C或C++语言编写的用最小二乘法进行曲线拟合

你的近似解析表达式是y=atbt 2ct 2。是否要写成y=atbt 2ct 3,但实际拟合表达式是y=a [3] a [2] ta [1] t 2a [0] t 3?会有一个不变的项。简单来说,所谓拟合,就是某个函数的几个离散函数值{f1,f2,…,fn}是已知的,通过调整函数中的一些待定系数f(1,2,…,3),使函数与已知点集(最小二乘意义)的差最小化。如果待定函数是线性的,称为线性拟合或线性回归(主要在统计学中),否则称为非线性拟合或非线性回归。表达式也可以是分段函数,在这种情况下称为样条拟合。曲线拟合:# include # include # include # include # include # include smooth(double * x,double * y,double * a,int n,int m,double * dt1,double * dt2,double * dt3);void main() { int i,n,m;double *x、*y、*a、dt1、dt2、dt3、b;n=12//12个采样点m=4;//三次多项式拟合b=0;//x的初始值为0/*分别为x、y、a y和a分配的存储空间*/x=(double *) calloc (n,size为(double));If(x==NULL) {printf("内存分配失败\ n ");退出(0);} y=(double *)calloc(n,sizeof(double));If(y==NULL) {printf("内存分配失败\ n ");退出(0);} a=(double *)calloc(n,sizeof(double));If(a==NULL) {printf("内存分配失败\ n ");退出(0);} for(I=1;I=n;I){ x[I-1]=b(I-1)* 5;/*每5分钟取一分,所以连续取12分*/} y[0]=0;y[1]=1.27;y[2]=2.16;y[3]=2.86;y[4]=3.44;y[5]=3.87;y[6]=4.15;y[7]=4.37;y[8]=4.51;y[9]=4.58;y[10]=4.02;y[11]=4.64;/* x[I-1]点对应的y值为拟合已知值*/Smooth(x,y,a,n,m,dt1,dt2,dt3);/*调用拟合函数*/for(I=1;I=m;i ) printf("a[%d]=%.10f\n ",(i-1),a[I-1]);Printf("拟合多项式与数据点偏差的平方和为:\ n ");printf("%.10e\n ",dt1);Printf("拟合多项式绝对值和数据点偏差之和为:\ n ");printf("%.10e\n ",dt2);Printf("拟合多项式与数据点偏差的最大绝对值为:\ n ");printf("%.10e\n ",dt3);免费(x);/*可用存储空间*/free(y);/*可用存储空间*/free(a);/*可用存储空间*/} smooth (double * x,double * y,double * a,int n,int m,double * dt1,double * dt2,double * dt3)/(x,y,a,n,m,dt1,dt2,dt3)//。/*实一维数组,输入参数,存储节点的xi值*///double * y;/*实一维数组,输入参数,存储节点的yi值*///double * a;/*长度为m的双精度实一维数组

返回m一一次拟合多项式的m个系数*///int n;/*整型变量,输入参数,给定数据点的个数*///int m;/*整型变量,输入参数,拟合多项式的项数*///double * dt1;/*实型变量,输出参数,拟合多项式与数据点偏差的平方和*///double * dt2;/*实型变量,输出参数,拟合多项式与数据点偏差的绝对值之和*///double * dt3;/*实型变量,输出参数,拟合多项式与数据点偏差的绝对值最大值*/{ int i,j,k;双*s 、*t 、*b、z、d1、p、c、d2、g、q、dt;/*分别为s、t、b分配存贮空间*/s=(double *)calloc(n,sizeof(double));if(s==NULL) { printf("内存分配失败\ n ");退出(0);} t=(double *)calloc(n,sizeof(double));if(t==NULL) { printf("内存分配失败\ n ");退出(0);} b=(double *)calloc(n,sizeof(double));if(b==NULL) { printf("内存分配失败\ n ");退出(0);} z=0;for(I=1;I=n;I)z=z x[I-1]/n;/*z为各个x的平均值*/b[0]=1;D1=n;p=0;c=0;for(I=1;I=n;I){ p=p x[I-1]-z;c=c y[I-1];} c=c/D1;p=p/D1;a[0]=c * b[0];if(m1){ t[1]=1;t[0]=-p;D2=0;c=0;g=0;for(I=1;I=n;I){ q=x[I-1]-z-p;D2=D2 q * QC=y[I-1]* q c;g=(x[I-1]-z)* q * q g;} c=c/D2;p=g/D2;q=D2/D1;D1=d2a[1]=c * t[1];a[0]=c * t[0]a[0];} for(j=3;j=m;j){ s[j-1]=t[j-2];s[j-2]=-p * t[j-2]t[j-3];if(j=4)为(k=j-2;k=2;k-)s[k-1]=-p * t[k-1]t[k-2]-q * b[k-1];s[0]=-p * t[0]-q * b[0];D2=0;c=0;g=0;for(I=1;I=n;I){ q=s[j-1];for(k=j-1;k=1;k-)q=q *(x[I-1]-z)s[k-1];D2=D2 q * QC=y[I-1]* q c;g=(x[I-1]-z)* q * q g;} c=c/D2;p=g/D2;q=D2/D1;D1=d2a[j-1]=c * s[j-1];t[j-1]=s[j-1];for(k=j-1;k=1;k-){ a[k-1]=c * s[k-1]a[k-1];b[k-1]=t[k-1];t[k-1]=s[k-1];} } * dt1=0;* dt2=0;* dt3=0;for(I=1;I=n;I){ q=a[m-1];for(k=m-1;k=1;k-)q=q *(x[I-1]-z)a[k-1];dt=q-y[I-1];if(fabs(dt)* dt3)* dt3=fabs(dt);* dt1=* dt1 dt * dt*dt2=*dt2晶圆厂(dt);} /*释放存储空间*/免费;免费(t);免费(b );返回(1);}

Q4:怎么用C语言实现最小二乘法?

最小二乘法常用于根据实测数据求线性方程的最近似解。根据如图(图片引用于百度百科)的描述,利用C语言求,使用最小二乘法算法求线性方程的解,程序如下:#include #define N 4  //共有4个记录,根据需要增加记录typedef struct Data{ //定义实验记录结构  int w; //实验次数  double x;   double y;}DATA;//根据d中的n个DATA记录,计算出线性方程的a,b两值void getcs(DATA *d,int n,double &a,double &b){ double fi11=0,fi12=0,fi21=0,fi22=0,f1=0,f2=0; int i; for(i=0;i<n;i++){ fi11+=d[i].w; fi12+=d[i].w*d[i].x; fi21=fi12; fi22+=d[i].w*d[i].x*d[i].x; f1+=d[i].w*d[i].y; f2+=d[i].w*d[i].x*d[i].y; } //解一元一次方程 b=(f2*fi11/fi21-f1)/(fi22*fi11/fi21-fi12); a=(f2*fi12/fi22-f1)/(fi21*fi12/fi22-fi11); }int main(){ DATA d[N]={  //定义时赋初值,共4个记录 {2,0.1,1.1}, {1,0.2,1.9}, {1,0.3,3.1}, {1,0.4,3.9} }; double a,b; getcs(d,N,a,b);  //计算线性方程参数a,b printf("线性方程是:Y=%.4lf+%.4lfX\n",a,b);}

Q5:用c++写成的最小二乘法的算法思想

???

Q6:使用最小二乘法拟合直线 C++

//point.hclass Point //Point类的声明{public: //外部接口Point(float xx=0, float yy=0) {X=xx;Y=yy;}float GetX() {return X;}float GetY() {return Y;}friend float linefit(Point l_point[], int n_point); //友元函数//int型变量为点数private: //私有数据成员float X,Y;};//End of point.h//main.cpp#include#include#include "point.h"using namespace std;float linefit(Point l_point[], int n_point) //友元函数体{float av_x,av_y; //声明变量float L_xx,L_yy,L_xy;//变量初始化av_x=0; //X的平均值av_y=0; //Y的平均值L_xx=0; //LxxL_yy=0; //LyyL_xy=0; //Lxyfor(int i=0;i<n_point;i++) //计算X、Y的平均值{   av_x+=l_point[i].X/n_point;   av_y+=l_point[i].Y/n_point;}for(i=0;i<n_point;i++) //计算Lxx、Lyy和Lxy{   L_xx+=(l_point[i].X-av_x)*(l_point[i].X-av_x);   L_yy+=(l_point[i].Y-av_y)*(l_point[i].Y-av_y);   L_xy+=(l_point[i].X-av_x)*(l_point[i].Y-av_y);}cout<<"This line can be fitted by y=ax+b."<<endl;cout<<"a="<<L_xy/L_xx; //输出回归系数acout<<" b="<<av_y-L_xy*av_x/L_xx<<endl; //输出回归系数breturn float(L_xy/sqrt(L_xx*L_yy)); //返回相关系数r}int main(){Point l_p[10]={Point(6,10),Point(14,20),Point(26,30),   Point(33,40),Point(46,50),Point(54,60),Point(67,70),   Point(75,80),Point(84,90),Point(100,100)}; //初始化数据点float r=linefit(l_p,10); //进行线性回归计算cout<<"Line coefficient r="<<r<<endl; //输出相关系数}

版权声明:admin 发表于 2021年10月26日 下午11:30。
转载请注明:线性最小二乘法,c++和c# | 热豆腐网址之家

相关文章