linreg.cpp

来自「c++的数学物理方程数值算法源程序。这是"Numerical Methods f」· C++ 代码 · 共 46 行

CPP
46
字号
#include "NumMeth.h"void linreg(Matrix x, Matrix y, Matrix sigma,            Matrix &a_fit, Matrix &sig_a, Matrix &yy, double &chisqr) {// Function to perform linear regression (fit a line)// Inputs//   x       Independent variable//   y       Dependent variable//   sigma   Estimated error in y// Outputs//   a_fit   Fit parameters; a(1) is intercept, a(2) is slope//   sig_a   Estimated error in the parameters a()//   yy      Curve fit to the data//   chisqr  Chi squared statistic  //* Evaluate various sigma sums  int i, nData = x.nRow();  double sigmaTerm;  double s = 0.0, sx = 0.0, sy = 0.0, sxy = 0.0, sxx = 0.0;  for( i=1; i<=nData; i++ ) {    sigmaTerm = 1.0/(sigma(i)*sigma(i));      s += sigmaTerm;                  sx += x(i) * sigmaTerm;    sy += y(i) * sigmaTerm;    sxy += x(i) * y(i) * sigmaTerm;    sxx += x(i) * x(i) * sigmaTerm;  }  double denom = s*sxx - sx*sx;  //* Compute intercept a_fit(1) and slope a_fit(2)  a_fit(1) = (sxx*sy - sx*sxy)/denom;  a_fit(2) = (s*sxy - sx*sy)/denom;  //* Compute error bars for intercept and slope  sig_a(1) = sqrt(sxx/denom);  sig_a(2) = sqrt(s/denom);  //* Evaluate curve fit at each data point and compute Chi^2  chisqr = 0.0;  for( i=1; i<=nData; i++ ) {    yy(i) = a_fit(1)+a_fit(2)*x(i);     // Curve fit to the data    double delta = (y(i)-yy(i))/sigma(i);    chisqr += delta*delta;  // Chi square  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?