最小二乘法及相关系数c++源代码

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34438779/article/details/88378358

“懒” 是第一生产力!

所以懒得看代码的话,也有现成的程序可以直接用
(程序效果及如何操作见博客最后那张图片)

链接:https://pan.baidu.com/s/1mTRNStAgoP0LN7Hoovv2MQ
提取码:e5u2

复制这段内容后打开百度网盘手机App,操作更方便哦
作为一名软件学子,做数学题怎么可能老老实实地一个一个按计算器呢?
/*
因为之前我课本上有好傻的题,数据在列表时就四舍五入了
但显然,如果在一开始就四舍五入的话
结果就会偏差好多
所以不建议四舍五入
*/
浮点数运算有误差,并且数据玄学四舍五入。
程序仅供参考

#include <cmath>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;

const int MAX = 10086;
double x[MAX], y[MAX];
double x_2[MAX], y_2[MAX], xy[MAX];
double sum_x, sum_y, sum_x_2, sum_y_2, sum_xy;
double ave_x, ave_y, ave_x_2, ave_y_2, ave_xy;
int num = 1; //数据组数
int fff;

void input();
void output();
double f(double num); //amazing 四舍五入

int main()
{
	string fuck1 = " 是 否 要 求 数 据 四 舍 五 入 (输入0代表不用,其它代表用)";
	string fuck2 = " 输 入 的 x 和 y 之 前 用 空 格 隔 开(输入完成后按ctrl+z并回车)";
    cout << fuck1 << endl;
    cin >> fff;
    cout << fuck2;
    input();
    output();
    system("pause");
    return 0;
}
void input()
{
    while (cin >> x[num] >> y[num])
    {
        x_2[num] = f(x[num] * x[num]);
        y_2[num] = f(y[num] * y[num]);
        xy[num] = f(x[num] * y[num]);

        sum_x += x[num];
        sum_y += y[num];
        sum_x_2 += x_2[num];
        sum_y_2 += y_2[num];
        sum_xy += xy[num];

        num++;
    }
    num--;
    ave_x = sum_x / num;
    ave_y = sum_y / num;
    ave_x_2 = f(sum_x_2 / num);
    ave_y_2 = f(sum_y_2 / num);
    ave_xy = f(sum_xy / num);
}
void output()
{
    cout << setw(5) << "No i"
         << setw(10) << "xi"
         << setw(10) << "yi"
         << setw(10) << "x_2 i"
         << setw(10) << "y_2 i"
         << setw(10) << "xy i";
    cout << endl;
    for (int i = 1; i <= num; i++)
    {
        cout << setw(5) << i
             << setw(10) << x[i]
             << setw(10) << y[i]
             << setw(10) << x_2[i]
             << setw(10) << y_2[i]
             << setw(10) << xy[i] << endl;
    }
    cout << setw(5) << "sum:"
         << setw(10) << sum_x
         << setw(10) << sum_y
         << setw(10) << sum_x_2
         << setw(10) << sum_y_2
         << setw(10) << sum_xy << endl;
    cout << setw(5) << "ave:"
         << setw(10) << ave_x
         << setw(10) << ave_y
         << setw(10) << ave_x_2
         << setw(10) << ave_y_2
         << setw(10) << ave_xy << endl;

    double a = (ave_xy - ave_x * ave_y) / (ave_x_2 - ave_x * ave_x);
    double b = ave_y - a * ave_x;
    cout << "a is " << a << endl;
    cout << "b is " << b << endl;

    double L_xy = f(ave_xy - f(ave_x * ave_y));
    double L_xx = f(ave_x_2 - f(ave_x * ave_x));
    double L_yy = f(ave_y_2 - f(ave_y * ave_y));

    cout << "L_xy is " << L_xy << endl;
    cout << "L_xx is " << L_xx << endl;
    cout << "L_yy is " << L_yy << endl;
    cout << "R is " << L_xy / sqrt(L_xx * L_yy) << endl;
    cout << " 方 程 是 : y = " << a << "x + " << b << endl;
}
double f(double num)
{
    if (fff)
    {
        if (num - (int)num > 0.5)
            return (int)num + 1;
        else if (num - (int)num == 0.5)
        {
            //0.5时向偶数靠近
            if ((int)num & 1)
                return (int)num + 1;
            else
                return (int)num;
        }
        else
            return (int)num;
    }
    else
    {
        return num;
    }
}
/*

15 39.4
25.8 42.9
30 44.4
36.6 46.6
44.4 49.2

*/

运行效果如下:
fff
如果您有更友好的代码,也可以分享至
https://github.com/callmebg/least-square-method
一同造福还在上学的孩子吧!!!

展开阅读全文

没有更多推荐了,返回首页