#include <iostream>
using namespace std;
void LinearFit(double abr[],double x[],double y[],int n) {//线性拟合ax+b
double xsum, ysum,x2sum,xysum;
xsum = 0; ysum = 0; x2sum = 0; xysum = 0;
for (int i = 0; i < n; i++)
{
xsum += x[i];
ysum += y[i];
x2sum += x[i] * x[i];
xysum += x[i] * y[i];
}
abr[0] = (n*xysum - xsum * ysum) / (n*x2sum - xsum * xsum);//a
abr[1] = (ysum - abr[0] * xsum) / n;//b
double yavg = ysum / n;
double dy2sum1 = 0, dy2sum2 = 0;
for (int i = 0; i < n; i++)
{
dy2sum1 += ((abr[0] * x[i] + abr[1]) - yavg)*((abr[0] * x[i] + abr[1]) - yavg);//r^2的分子
dy2sum2 += (y[i] - yavg)*(y[i] - yavg);//r^2的分母
}
abr[2] = dy2sum1 / dy2sum2;//r^2
}
void HalfLogLine(double y[], int n) {//半对数拟合
for (int i = 0; i < n; i++)
{
y[i] = log10(y[i]);
}
}
void LogtoLine(double x[], double y[], int n) {//对数拟合
for (int i = 0; i < n; i++)
{
y[i] = log(y[i]);
x[i] = log(x[i]);
}
}
int main()
{
int const N = 10;//12;
//double x[N] = {0.96,0.94,0.92,0.90,0.88,0.86,0.84,0.82,0.80,0.78,0.76,0.74 };//半对数
//double y[N] = {558.0,313.0,174.0,97.0,55.8,31.3,17.4,9.70,5.58,3.13,1.74,1.00 };
double x[N] = { 0.1,1.0,3.0,5.0,8.0,10.0,20.0,50.0,80.0,100.0 };//对数
double y[N] = { 0.1,0.9,2.5,4.0,6.3,7.8,14.8,36.0,54.0,67.0 };
double abr[3];
//HalfLogLine(y, N);
LogtoLine(x, y, N);
LinearFit(abr, x, y, N);
abr[1] = exp(abr[1]);
cout << showpos;//显示正负号
cout <<"相关系数拟合直线:y=" << abr[0] << "x" << abr[1] << endl;
cout <<"相关系数:r^2"<< abr[2] << endl;
system("pause");
return 0;
}
C++实训--最小二乘法拟合直线
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 最小二乘法拟合 在函数拟合中,如果用p表示函数中需要确定的参数,那么目标就是找到一组p,使得下面函数S的值最小: ...
- 原文链接[http://www.ikeguang.com/?p=402] 阅读本文需要的知识储备: 高等数学概率论...
- 在了解了最小二乘法的基本原理之后python_numpy实用的最小二乘法理解,就可以用最小二乘法做曲线拟合了 1....