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

要求给出主要程序,程序后缀用"//"注释一下各模块的作用``````

    最小二乘法常用于根据实测数据求线性方程的最近似解。根据如图(图片引用于百度百科)的描述,利用C语言求,使用最小二乘法算法求线性方程的解,程序如下:


#include <stdio.h>
#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);
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-06-09

    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

    例程:

    /* 
    最小二乘法C++实现 
    参数1为输入文件 
    输入 : x 
    输出: 预测的y   
    */  
    #include<iostream>  
    #include<fstream>  
    #include<vector>  
    using namespace std;  
      
    class LeastSquare{  
        double a, b;  
    public:  
        LeastSquare(const vector<double>& x, const vector<double>& y)  
        {  
            double t1=0, t2=0, t3=0, t4=0;  
            for(int i=0; i<x.size(); ++i)  
            {  
                t1 += x[i]*x[i];  
                t2 += x[i];  
                t3 += x[i]*y[i];  
                t4 += y[i];  
            }  
            a = (t3*x.size() - t2*t4) / (t1*x.size() - t2*t2);  // 求得β1   
            b = (t1*t4 - t2*t3) / (t1*x.size() - t2*t2);        // 求得β2  
        }  
      
        double getY(const double x) const  
        {  
            return a*x + b;  
        }  
      
        void print() const  
        {  
            cout<<"y = "<<a<<"x + "<<b<<"\n";  
        }  
      
    };  
      
    int main(int argc, char *argv[])  
    {  
        if(argc != 2)  
        {  
            cout<<"Usage: DataFile.txt"<<endl;  
            return -1;  
        }  
        else  
        {  
            vector<double> x;  
            ifstream in(argv[1]);  
            for(double d; in>>d; )  
                x.push_back(d);  
            int sz = x.size();  
            vector<double> y(x.begin()+sz/2, x.end());  
            x.resize(sz/2);  
            LeastSquare ls(x, y);  
            ls.print();  
              
            cout<<"Input x:\n";  
            double x0;  
            while(cin>>x0)  
            {  
                cout<<"y = "<<ls.getY(x0)<<endl;  
                cout<<"Input x:\n";  
            }  
        }  
    }

第2个回答  2013-10-11
最小二乘法,你要给处计算方法舍
我记得一次最小二乘法有个公式,LZ给出才能做本回答被网友采纳

怎么用C语言实现最小二乘法?
最小二乘法常用于根据实测数据求线性方程的最近似解。根据如图(图片引用于百度百科)的描述,利用C语言求,使用最小二乘法算法求线性方程的解,程序如下:include <stdio.h>#define N 4 \/\/共有4个记录,根据需要增加记录typedef struct Data{ \/\/定义实验记录结构 int w; \/\/实验次数 double x; ...

最小二乘法的c语言程序怎么编呀
} void convert(float argu[][T+2],int n)

单片机c语言的最小二乘法怎么实现,求代码
printf("最小二乘法所算得的斜率和截距分别为%f和%f\\n",a,b);} else printf("mun"输入有误!);}

用c语言编写最小二乘法
sumxx = new double[poly_n * 2 + 1];tempy = new double[n];sumxy = new double[poly_n + 1];ata = new double[(poly_n + 1)*(poly_n + 1)];for (i = 0; i<n; i++){ tempx[i] = 1;tempy[i] = y[i];} for (i = 0; i<2 * poly_n + 1; i++)for ...

c语言最小二乘法 求助
\/\/\/最小二乘法\/\/\/ \/\/mean_x,mean_y均值,\/\/y=ax+b \/\/sum_xy为x[i]*y[i]的和 \/\/sum_xx为x平方的和 \/\/wiki 最小二乘法给出了两个公式,结果相同 ,选一个就行了 double mean_x,mean_y,a,b,sum_xy,sum_xx;mean_x = 0;mean_y = 0;sum_xx = 0;sum_xy = 0;\/\/\/...

求空间圆最小二乘拟合的C语言程序
2个向量 的 叉乘积 的 方向 就是 法线方向。2个向量 的 点乘积 的 方向 就是 切线 方向。叉乘积公式 用 行列式记:白白白白| i j k | a X b = | a1 a2 a3| 白白白白| b1 b2 b3| 点乘积 公式简单,略。把 方向 系数 代入 空间圆的参数方程 求解便可。--- 还有个关...

C语言 制作一个可供小学数学运算程序
先,打出c语言开始的那几行代码:要进行两个间数字的计算首先要输入第一个数字,运算符还有第二个数字:接着,需要对运算符进行判断,这里利用if和else if进行判断,运算结果保留两位小数:这样就可以进行简单的两位数之间的计算了 这样程序只能执行一次,如果想让程序进行多次计算只需要嵌套一层循环即可...

计算y=x1*x2*...x9*x10 的主要汇编程序与C语言程序,并给程序添加注释...
int a[10] = {x1,x2,x3,x4,x5,x6,x7,x8,x9x,10}; \/\/先将10个变量存起来、假设变量都是int类型 void main(){ int i;long int result=1; \/\/用来保存相乘的结果、10个数相乘的结果可能会比较大 for(i=0;i<10;i++) \/\/相乘 { result = result * a[i]; } printf("%l...

关于最小二乘法在C语言数据结构应用
这是最经典的旅行商问题,有很多很多算法,能够保证一定能得到最短路径,并且效率也较高的算法,是有,但很难找,也没有源代码

急求一元线性回归的C语言程序
一元线性回归的C语言程序是:利用最小二乘法来估计线性回归方程的参数,然后用这些参数来预测因变量的值1。例如,你可以参考下面的代码:include <stdio.h>#include <math.h>\/\/定义一个函数,计算一元线性回归方程的参数a和bvoid linear_regression(double x[], double y[], int n, double *a, ...

相似回答