曲线拟合最小二乘法c++程序

合集下载

c++最小二乘法迭代拟合曲线

c++最小二乘法迭代拟合曲线

最小二乘法迭代拟合曲线是一种数学方法,用于通过最小化误差平方和来拟合数据点。

在C++中,可以使用以下步骤实现最小二乘法迭代拟合曲线:1. 定义数据点的结构体,包含x和y坐标。

2. 计算数据点的平均值。

3. 计算协方差矩阵。

4. 计算协方差矩阵的特征值和特征向量。

5. 使用特征向量作为基向量,将数据点投影到新的坐标系。

6. 在新坐标系中,使用线性回归拟合曲线。

7. 将拟合曲线转换回原始坐标系。

以下是一个简单的C++实现:cpp#include <iostream>#include <vector>#include <cmath>#include <Eigen/Dense>struct Point {double x;double y;};double mean(const std::vector<Point>& points) {double sum = 0;for (const auto& point : points) {sum += point.x;}return sum / points.size();}Eigen::MatrixXd covariance_matrix(const std::vector<Point>& points) { double mean_x = mean(points);double mean_y = mean(points);Eigen::MatrixXd cov(2, 2);cov << 0, 0, 0, 0;for (const auto& point : points) {double dx = point.x - mean_x;double dy = point.y - mean_y;cov(0, 0) += dx * dx;cov(0, 1) += dx * dy;cov(1, 0) += dx * dy;cov(1, 1) += dy * dy;}return cov;}std::pair<double, double> least_squares_iterative_fit(const std::vector<Point>& points) {Eigen::MatrixXd cov = covariance_matrix(points);Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> solver(cov);Eigen::VectorXd eigenvalues = solver.eigenvalues();Eigen::MatrixXd eigenvectors = solver.eigenvectors();Eigen::VectorXd mean_vec(2);mean_vec << mean(points), mean(points);Eigen::VectorXd projected_mean = eigenvectors.transpose() * mean_vec;Eigen::VectorXd projected_points(points.size());for (size_t i = 0; i < points.size(); ++i) {Eigen::VectorXd point_vec(2);point_vec << points[i].x, points[i].y;projected_points(i) = (eigenvectors.transpose() * point_vec)(0);}double a = projected_points.sum() / points.size();double b = projected_mean(0);return std::make_pair(a, b);}int main() {std::vector<Point> points = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}};auto result = least_squares_iterative_fit(points);std::cout << "y = " << result.first << "x + " << result.second << std::endl;return 0;}这个示例中,我们使用了一个简单的线性模型(y = ax + b)来拟合数据点。

c语言最小二乘法拟合曲线

c语言最小二乘法拟合曲线

c语言最小二乘法拟合曲线C语言中,可以使用最小二乘法来拟合曲线。

最小二乘法是一种常用的数学优化方法,用于找到一条曲线,使得曲线和实际数据之间的误差最小。

下面是一个简单的示例代码,使用最小二乘法来拟合一条直线的曲线。

c#include <stdio.h>// 最小二乘法拟合直线void leastSquareFit(int n, double x[], double y[], double* slope, double* intercept) {// 计算 x 和 y 的平均值double sumX = 0, sumY = 0;for (int i = 0; i < n; i++) {sumX += x[i];sumY += y[i];}double meanX = sumX / n;double meanY = sumY / n;// 计算直线的斜率double numerator = 0, denominator = 0;for (int i = 0; i < n; i++) {numerator += (x[i] - meanX) * (y[i] - meanY);denominator += (x[i] - meanX) * (x[i] - meanX);}*slope = numerator / denominator;// 计算直线的截距*intercept = meanY - (*slope) * meanX;}int main() {// 原始数据double x[5] = {1, 2, 3, 4, 5};double y[5] = {2, 4, 6, 8, 10};// 拟合结果double slope, intercept;leastSquareFit(5, x, y, &slope, &intercept);printf("拟合直线方程:y = %.2fx + %.2f\n", slope, intercept);return 0;}运行以上代码,将得到拟合直线方程为:`y = 2.00x + 0.00`。

最小二乘法-曲线拟合—C语言程序

最小二乘法-曲线拟合—C语言程序
}
for(i=0;i<=m;i++)
s[i][m+1]=t[i][0];
for(i=0;i<=m;i++)
{
for(j=0;j<=m+1;j++)
printf("%f\t",s[i][j]);
printf("\n");
}
ColPivot(s,m+1,t,x);
printf("\n\n");
for(i=0;i<=m;i++)
}
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=i+1;j--)
b[i][0]=b[i][0]-a[i][j]*x[j];
x[i]=b[i][0]/a[i][i];
}
}
void main()
{
float x[99],y[99],z[99],s[99][99],t[99][1];
for(j=k;j<n;j++)
{
temp=a[I][பைடு நூலகம்]; a[I][j]=a[k][j]; a[k][j]=temp;
}
}
for(i=k+1;i<n;i++)
{
m=a[i][k]/a[k][k];
b[i][0]=b[i][0]-b[k][0]*m;
for(j=0;j<n;j++)
a[i][j]=a[i][j]-a[k][j]*m;
printf("\na[%d]=%f",i,x[i]);

c++曲线拟合算法

c++曲线拟合算法

c++曲线拟合算法
C++中有多种曲线拟合算法可供选择,以下是其中一些常用的算法:
1. 最小二乘法(Least Squares Method):最小二乘法是一种常见的曲线拟合方法,通过最小化残差平方和来拟合数据点。

C++中可以使用线性回归或非线性优化库(如Eigen、Ceres Solver、GSL等)实现最小二乘拟合。

2. 多项式拟合(Polynomial Fitting):多项式拟合通过拟合一条多项式曲线来逼近数据点。

C++中可以使用最小二乘法或其他数值计算库实现多项式拟合。

3. 样条曲线拟合(Spline Curve Fitting):样条曲线拟合是一种平滑的曲线拟合方法,通过连接多个小段曲线来逼近数据点。

C++中可以使用数值计算库(如Boost、GSL)或专门的插值库(如Spline、Dlib)实现样条曲线拟合。

4. 非线性最小二乘法(Nonlinear Least Squares):非线性最小二乘法用于拟合非线性模型,通常需要使用迭代优化算法(如Levenberg-Marquardt算法)来寻求最优解。

C++中可以使用非线性优化库(如Ceres Solver、NLopt、GSL)实现非线性最小二乘拟合。

以上仅是一些常用的曲线拟合算法,具体选择应根据您的数据特点、拟合需求和项目要求来决定。

您可以根据具体情况选择适合的算法,并使用相应的数值计算库或优化库进行实现。

最小二乘法多项式拟合c语言

最小二乘法多项式拟合c语言

最小二乘法多项式拟合c语言
最小二乘法多项式拟合是一种数学方法,用于在一组数据点中拟合一个多项式函数,以最小化误差的平方和。

这种方法常用于数据分析和统计学中,可以用来预测未来的趋势或者揭示数据背后的规律。

C语言是一种广泛使用的编程语言,可以用来实现最小二乘法多项式拟合算法。

在C语言中,可以使用数值计算库来进行数据计算和多项式拟合。

常用的数值计算库包括GNU Scientific Library (GSL)、Numerical Recipes等。

实现最小二乘法多项式拟合的基本步骤如下:
1. 定义多项式的阶数,例如3阶多项式。

2. 读入待拟合的数据点,包括 x 值和 y 值。

3. 根据拟合的阶数,构造矩阵A和向量b,其中A是一个矩阵,每一行代表一个数据点,每一列代表一个多项式系数,b是一个向量,每个元素代表一个数据点的y值。

4. 使用最小二乘法求解多项式系数向量c,使得误差平方和最小。

5. 输出多项式系数向量c,即可得到拟合的多项式函数。

最小二乘法多项式拟合在实际应用中具有广泛的应用,例如曲线拟合、数据预测、信号处理等领域。

在C语言中使用最小二乘法多项式拟合算法,可以有效地处理大量的数据,并获得较为准确的预测结果。

- 1 -。

最小二乘法C语言的实现

最小二乘法C语言的实现

实验三.最小二乘法C语言的实现1.实验目的:进一步熟悉曲线拟合的最小二乘法。

掌握编程语言字符处理程序的设计和调试技术。

2.实验要求:输入:已知点的数目以及各点坐标。

输出:根据最小二乘法原理以及各点坐标求出拟合曲线。

3.程序流程:(1)输入已知点的个数;(2)分别输入已知点的X坐标;(3)分别输入已知点的Y坐标;(4)通过调用函数,求出拟合曲线。

最小二乘法原理如下:根据一组给定的实验数据,求出自变量x与因变量y的函数关系,只要求在给定点上的误差的平方和最小.当时,即(4.4.1)这里是线性无关的函数族,假定在上给出一组数据,以及对应的一组权,这里为权系数,要求使最小,其中(4.4.2)(4.4.2)中实际上是关于的多元函数,求I的最小值就是求多元函数I的极值,由极值必要条件,可得(4.4.3)根据内积定义引入相应带权内积记号(4.4.4)则(4.4.3)可改写为这是关于参数的线性方程组,用矩阵表示为(4.4.5)(4.4.5)称为法方程.当线性无关,且在点集上至多只有n个不同零点,则称在X上满足Haar条件,此时(4.4.5)的解存在唯一。

记(4.4.5)的解为从而得到最小二乘拟合曲线(4.4.6) 可以证明对,有故(4.4.6)得到的即为所求的最小二乘解.它的平方误差为(4.4.7) 均方误差为在最小二乘逼近中,若取,则,表示为(4.4.8)此时关于系数的法方程(4.4.5)是病态方程,通常当n≥3时都不直接取作为基。

程序流程图:↓↓程序:#include <math.h> #include <stdio.h> #include <stdlib.h> #include<malloc.h>float average(int n,float *x) {int i; float av; av=0;for(i=0;i<n;i++) av+=*(x+i);return(av);}//平方和float spfh(int n,float *x){int i;float a,b;a=0;for(i=0;i<n;i++)a+=(*(x+i))*(*(x+i));return(a);}//和平方float shpf(int n,float *x){int i;float a,b;a=0;for(i=0;i<n;i++)a=a+*(x+i);b=a*a/n;return(b);}//两数先相乘,再相加float dcj(int n,float *x,float *y) {int i;float a;a=0;for(i=0;i<n;i++)a+=(*(x+i))*(*(y+i));return(a);}//两数先相加,再相乘float djc(int n,float *x,float *y) {int i;float a=0,b=0;for(i=0;i<n;i++){a=a+*(x+i);b=b+*(y+i);}a=a*b/n;}//系数afloat xsa(int n,float *x,float *y){float a,b,c,d,e;a=spfh(n,x);b=shpf(n,x);c=dcj(n,x,y);d=djc(n,x,y);e=(c-d)/(a-b);//printf("%f %f %f %f",a,b,c,d);return(e);}float he(int n,float *y){int i;float a;a=0;for(i=0;i<n;i++)a=a+*(y+i);return(a);}float xsb(int n,float *x,float *y,float a){ float b,c,d;b=he(n,y);c=he(n,x);d=(b-a*c)/n;return(d);}void main(){ int n,i;float *x,*y,a,b;printf("请输入将要输入的有效数值组数n的值:"); scanf("%d",&n);x=(float*)calloc(n,sizeof(float));if(x==NULL){printf("内存分配失败");exit(1);}y=(float*)calloc(n,sizeof(float));if(y==NULL){printf("内存分配失败");exit(1);}printf("请输入x的值\n");for(i=0;i<n;i++)scanf("%f",x+i);printf("请输入y的值,请注意与x的值一一对应:\n"); for(i=0;i<n;i++)scanf("%f",y+i);for(i=0;i<n;i++){ printf("x[%d]=%3.2f ",i,*(x+i));printf("y[%d]=%3.2f\n",i,*(y+i));}a=xsa(n,x,y);b=xsb(n,x,y,a);printf("经最小二乘法拟合得到的一元线性方程为:\n"); printf("f(x)=%3.2fx+%3.2f\n",a,b);}。

C++最小二乘法求多项式拟合曲线

// shujunihe.cpp : 定义控制台应用程序的入口点。

//// quanzhuyuan.cpp : 定义控制台应用程序的入口点// #include "stdafx.h"#include <iostream>#include <string>#include <cmath> using namespace std;class shujunihe{public :shujunihe():xlh(0),fyl( false ),cnt(0),n(9){}void printb( double (&)[3]);void printa( double [3][3]);void quanzhuyuan( double a[3][3], double b[], int x2[3]);void restoreA( double a[3][3], double x[]);double Sum( int r,int c,double []); double Sumf( int r, double f[], double x[]);void restoreB( double b[], double f[], double x[]); voidprintx2( int x[]);private :int xlh; bool fyl; int cnt;int n;};void shujunihe::printx2( int x2[]){for (int i=0;i<3;i++) cout<<x2[i]<< " " ;cout<<endl;}void shujunihe::restoreB( double b[], double f[], double x[]) {for (int i=0;i<=2;i++){ b[i]=Sumf(i,f,x);}}double shujunihe::Sumf( int r, double f[], double x[]){double sum=0;for (int i=0;i<=n-1;i++){ sum+=f[i]*pow(x[i], r);}return sum;void printx( double x[3], double a[3][3], double b[3], intn);}double shujunihe::Sum( int r,int c,double x[]){double sum=0;for (int i=0;i<=n-1;i++ ){ sum+=pow(x[i], r+c);}return sum;}void shujunihe::restoreA( double a[3][3], double x[]){for (int i=0;i<=2;i++){for (int j=0;j<=2;j++){ a[i][j]=Sum(i,j,x);}}a[0][0]=n;}void shujunihe::quanzhuyuan( double d[3][3], double c[3], int x2[3]) {double max;int row,col;double temp1,temp2; int temp3;double btemp1;for (int i=0;i<3;i++){max=fabs(d[i][i]);row=i;col=i;for (int j=i;j<3;j++){for (int k=i;k<3;k++){if (fabs(d[j][k])>max){max=fabs(d[j][k]);row=j;col=k;}}/*for(int n=0;n<d.length;n++)//hang {temp1=a[i][n];a[i][n]=a[row][n]; a[row][n]=temp1;btemp1=b[i];b[i]=b[row];b[row]=btemp1;}for(int m=0;m<d.length;m++)//lie{temp2=a[m][i]; a[m][i]=a[m][col];a[m][col]=temp2;}*/if (col!=i&&row!=i){fyl= true ;xlh=col;for (int n=0;n<3;n++) //hang {temp1=d[i][n];d[i][n]=d[row][n];d[row][n]=temp1;btemp1=c[i];c[i]=c[row];c[row]=btemp1;}for (int m=0;m<3;m++) //lie {temp2=d[m][i];d[m][i]=d[m][col];d[m][col]=temp2;}}elseif(row!=i&&col==i)for (int n=0;n<3;n++) //hang{temp1=d[i][n]; d[i][n]=d[row][n];d[row][n]=temp1; btemp1=c[i];c[i]=c[row]; c[row]=btemp1;}}elseif (col!=i&&row==i){fyl= true ;//liefor (int m=0;m<3;m++){ xlh=col; temp2=d[m][i];d[m][i]=d[m][col];d[m][col]=temp2;if (fyl){temp3=x2[i];x2[i]=x2[xlh];x2[xlh]=temp3;//x1[cnt]=i;//y1[cnt]=xlh;cnt++;fyl= false ;}for (int j=i+1;j<3;j++) //J 表示行{double l=d[j][i]/d[i][i];for (int e=i+1;e<3;e++) //e 表示 j 行对于的每一列{ d[j][e]=d[j][e]-l*d[i][e];}c[j]=c[j]-l*c[i];d[j][i]=0;}}}void shujunihe::printx( double x[3], double a[3][3], double b[3], int n) {x[n-1]=b[n-1]/a[n-1][n-1];for (int i=n-2;i>=0;i--){double sum=0;for (int j=i+1;j<=n-1;j++){sum+=a[i][j]*x[j];}x[i]=1/a[i][i]*(b[i]-sum);}for (int k=0;k<=n-1;k++) cout<<x[k]<< " cout<<endl;}void shujunihe::printa( double a[3][3]){for (int i=0;i<3;i++){for (int j=0;j<3;j++) cout<<a[i][j]<< " ";cout<<endl;}}void shujunihe::printb( double (&b)[3]){int size= sizeof (b)/ sizeof (double );for (int s=0;s<size;s++){ cout<<b[s]<< " " ;}cout<<endl;}int main(){double x[]={1,3,4,5,6,7,8,9,10};double f[]={10,5,4,2,1,1,2,3,4};double a[3][3];double b[3];double x1[3];int x2[3]={1,2,3}; shujunihe xy; xy.restoreA(a,x);xy.restoreB(b,f,x); cout<< " 正规方程的系数矩阵a" <<endl;xy.printa(a);cout<< " 正规方程的 b" <<endl;xy.printb(b);xy.quanzhuyuan(a,b,x2);cout<< " 全主元化简后的系数矩阵 a" <<endl; xy.printa(a);cout<< " 全主元化简后的 b" <<endl; xy.printb(b);cout<< "x 的求解的值 "<<endl; xy.printx(x1,a,b,3);coutvv "x对应的位置"vvendl; xy.printx2(x2);}。

python最小二乘法拟合曲线程序

Python最小二乘法拟合曲线程序1. 简介在数据分析和机器学习领域,拟合曲线是一种常见的技术,用于找到最佳曲线来描述数据的关系。

其中,最小二乘法是一种常用的拟合曲线方法之一。

Python作为一种流行的编程语言,在科学计算和数据分析方面具有广泛的应用。

本文将介绍如何使用Python实现最小二乘法来拟合曲线。

2. 最小二乘法最小二乘法是一种数学优化方法,用于找到与给定数据点最能匹配的曲线或函数。

它通过最小化残差平方和来实现这一目标。

残差是指观测值与拟合值之间的差异。

假设我们有一个包含n个数据点的样本集合:{(x1, y1), (x2, y2), …, (xn, yn)}。

我们希望找到一个函数f(x)来近似描述这些数据点。

最小二乘法通过寻找使得残差平方和最小化的函数参数来实现这一目标。

3. Python实现在Python中,我们可以使用scipy库提供的curve_fit()函数来执行最小二乘法拟合曲线。

首先,我们需要导入必要的库:import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fit然后,我们定义一个用于拟合的函数。

这个函数的参数将在最小二乘法过程中进行优化调整。

例如,我们可以使用一个多项式函数来拟合数据:def polynomial_func(x, *coefficients):y = 0for i, c in enumerate(coefficients):y += c * x**ireturn y接下来,我们准备好我们的数据。

在这个例子中,我们使用一个简单的正弦曲线作为示例:x = np.linspace(0, 2*np.pi, 100)y = np.sin(x) + np.random.normal(0, 0.1, 100)现在,我们可以使用curve_fit()函数来执行最小二乘法拟合曲线:popt, pcov = curve_fit(polynomial_func, x, y)popt是一个包含了最佳拟合参数的数组,pcov是协方差矩阵。

c++ 最小二乘曲线拟合

C++ 最小二乘曲线拟合============在数据分析和统计学中,最小二乘法是一种常用的数学优化技术。

它通过最小化误差的平方和来找到最佳函数匹配。

在C++中实现最小二乘曲线拟合可以帮助我们理解和操作这些数据。

原理概述----假设我们有一组数据点\((x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\),我们希望找到一个函数 \(f(x)\) ,通常是一个多项式,使得 \(f(x_i) \approx y_i\) 对于所有的\(i\)。

最小二乘法的目标是找到这样的 \(f(x)\) ,它使得所有 \(f(x_i)\) 与实际观察点之间的总差距,或者说不等式子的总体离散最小化,具体来说就是要使得和\(\sum_{i=1}^{n} [f(x_i) - y_i]^2\) 尽可能小。

代码实现----以下是使用C++和Eigen库实现最小二乘多项式拟合的一个简单例子。

Eigen是一个高级C++库,用于线性代数、矩阵和向量操作、数值分析和相关的算法。

```cpp#include <iostream>#include <Eigen/Dense>using namespace Eigen;using namespace std;// 构造X矩阵和Y向量MatrixXd constructX(const VectorXd& x, int degree) {int n = x.size();MatrixXd X(n, degree + 1);X << x, x.array().pow(2), x.array().pow(3), x.array().pow(4), x.array().pow(5); // 根据degree调整列数return X;}// 计算最小二乘解VectorXd leastSquares(const MatrixXd& X, const VectorXd& y) {return X.bdcSvd(ComputeThinU | ComputeThinV).solve(y); // 使用SVD 分解求解X*b = y}int main() {// 构造数据点(x和y)VectorXd x = VectorXd::LinSpaced(10, 0, 10); // 生成10个0到10之间的等距点VectorXd y = 3 * x.array().pow(2) + 2 * x.array() + 1; // y = 3x^2 + 2x + 1 (无噪声)y += VectorXd::Random(10).array() * 10; // 添加一些噪声// 构造X矩阵和计算最小二乘解MatrixXd X = constructX(x, 2); // 这里使用二次多项式,所以degree = 2。

最小二乘法一阶线性拟合二阶曲线拟合的C语言程序实现

一最小二乘法原理与计算方法对于组测量数据选取进行阶拟合按照残差平方和最小原则对各个待定系数求偏导数使之都等于0通过数学运算可得到各个系数的运算式如下求解这个线性方程组就可以得出各个系数的值
一、最小二乘法原理与计算方法
对于 m 组测量数据,选取
( x) a0 a1 x a2 x 2
二、1 阶 2 阶拟合功能子函数和计算表达式
通过分析以上系数计算式中各项计算式,写出全部需要用到的子函数:
通过对照系数表达式里各个项的计算表达,写入主函数进行拟合计算。设定输入的数据格式为(x[ i ],y[ i ]) ,用 户输入数据的个数为 c,计算表达式程序代码如下: 1 阶直线拟合:
2 阶曲线拟合:
三、主函数代码
四、用 MATLAB 验证程序的运行结果
第一组:选择 y=x+1 进行线性拟合检验,可见 2 阶拟合对于线性关系,二次项系数为 0
第二组:选择 y=x^2+1入部分的设计参考了[物理实验计算器.
Zhouzb .
zhouzb889@]的部分代码,在此表示感谢。
m n i
当 n=1 时,为 1 阶拟合,又称直线拟合,即系数矩阵是一个 2*2 的矩阵,通过线性方程的求解运 算,求得线性回归方程的系数表达式为:
当 n=2 时,为 2 阶曲线拟合,所得到的系数矩阵是一个 3*3 的矩阵【用 aij(i,j=1,2,……)的 形式表达】 ,通过线性方程的求解运算,求得线性回归方程的系数表达式为:
智能仪器设计作业——最小二乘法——高世浩 1223150078
x
i 1 m
m
i
x
i 1
2 i
x
i 1
m
n 1 i
m x yi 0 i 1 i 1 m m n 1 x x y i 1 i i i 1 i 1 m m n xin yi xi2 n i 1 i 1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课题八曲线拟合的最小二乘法
实验目标:
在某冶炼过程中,通过实验检测得到含碳量与时间关系的数据如下,试求含碳量y与时间t
#include<iostream>
#include<>
using namespace std;
int Array(double ***Arr, int n){
double **p;
int i;
p=(double **)malloc(n*sizeof(double *));
if(!p)return 0;
for(i=0;i<n;i++)
{
p[i]=(double *)malloc(n*sizeof(double));
if(!p[i])return 0;
}
*Arr=p;
return 1;
}
void main(){
int n,i,j,k;
double **A,*B,*S;
S=new double[3];
B=new double[3];
cout<<"共2有®DN个节¨²点Ì:êo";
cin>>n;
cout<<"请输º入¨节¨²点Ì值¦Ì(ê¡§Xi)ê:êo"<<endl;
double *X;
X = new double[n];
for(i=0;i<n;i++){
cin>>X[i];
}
cout<<"请输º入¨节¨²点Ì函¡¥数ºy值¦Ì(ê¡§Yi)ê:êo"<<endl;double *Y;
Y = new double[n];
for(i=0;i<n;i++){
cin>>Y[i];
}
if(!Array(&A,3))
cout<<"内¨²存ä分¤配失º¡ì败㨹!ê"; else
{
for(i=0;i<3;i++){
for(j=0;j<3;j++){
A[i][j]=0;
}
}
for(i=0;i<n;i++){
A[0][0]+=1;// cout<<A[0][0];
A[0][1]+=X[i];
A[0][2]+=X[i]*X[i];
A[1][0]=A[0][1];
A[1][1]=A[0][2];
A[1][2]+=X[i]*X[i]*X[i];
A[2][0]=A[0][2];
A[2][1]=A[1][2];
A[2][2]+=X[i]*X[i]*X[i]*X[i];
}
}
for(i=0;i<3;i++){
B[i]=0;
}
for(i=0;i<n;i++){
B[0]+=Y[i];
B[1]+=X[i]*Y[i];
B[2]+=X[i]*X[i]*Y[i];
}
for( k = 0; k < 2 ;k++)
{
for(i = k+1; i<3; i++)
{
double T = A[i][k]/A[k][k];
B[i] = B[i] - T * B[k];
for ( j = k+1 ; j < 3 ; j++ )
{
A[i][j] = A[i][j] - T * A[k][j];
}
}
}
S[2] = B[2]/A[2][2];
for (i = 1; i >=0 ; i--)
{
double Temp = 0;
for (int j = i+1; j<2 ;j++)
Temp = Temp + A[i][j] * S[j];
S[i] = (B[i] - Temp) /A[i][i];
}
cout<<"拟a合曲¨²线为a:êo"<<endl;
cout<<"y="<<S[0]<<" + "<<S[1]<<" x + "<<S[2]<<"
x^2 "<<endl<<endl
<<"误¨®差为a:êo"<<endl;
for(i=0;i<n;i++){
cout<<"Y"<<i<<"-Y(t"<<i<<")="<<S[0]+S[i]*X[i]+S[2]*X[i ]*X[i]-Y[i]<<endl;
}
}。

相关文档
最新文档