C++实现最小二乘法对y=exp(x)的二次拟合
2016-04-24 23:08
543 查看
#include<iostream> #include<math.h> const int N=20; const int n=3; double A ; double B ; double start=0, end=1.0;//积分范围 const double PI=3.1415926; using namespace std; void HibertMatrix(); double func1(double x); double func2(double x); void projectAarry(); void jacobi(); int main() { ////double A ; ////double B ; ////double start=0, end=1.0;//积分范围 HibertMatrix(); //生成希尔伯特矩阵 projectAarry();//生成投影矩阵 jacobi();//求解正规方程 return 0; } void HibertMatrix()//希尔伯特矩阵的生成 { for(int i=0;i<n;i++) for(int j=0;j<n;j++) A[i][j]=1.0/(i+j+1); } double func1(double x) //Expansion function { return exp(x); } double func2(double x) //Base function { return x; } void projectAarry() { double h=(end-start)/N; for(int i=0;i<n;i++) { B[i]=(pow(func2(start),i)*func1(start)+pow(func2(end),i)*func1(end))*h/2; for(int k=1;k<N;k++) B[i]+=pow(func2(start+k*h),i)*func1(start+k*h)*h; cout<<B[i]<<'\t'; } cout<<endl; } void jacobi() { // double A ={{10,-1.0,-2.0},{-1.0,10.0,-2.0},{-1.0,-1.0,5.0}}; // double B ={72,83,42}; double X ={0,0,0,}; for (int k=0;k<100;k++) { for(int i=0;i<n;i++) { double sum=0; for(int j=0;j<n;j++) { if(j==i) continue; sum+=A[i][j]*X[j]; } X[i]=(B[i]-sum)/A[i][i]; } } for (int i=0;i<n;i++) cout<<X[i]<<'\t'; cout<<endl; }
相关文章推荐
- 关于int类型取值范围的计算 以及为何16位int类型范围是- 32768 ~ 32767
- c++上机第四次实验-【项目3:乘法口诀表】
- C语言位操作
- 重拾梦想 C++
- C++第4次实验——三色球问题
- 一个算法题目的两种不同效率级别的算法对比
- 【模板】c++ 大数模板
- C++理解全局变量在调用函数中的应用
- C语言指针实现循环报数问题(简单约瑟夫环问题)
- UVA - 10115 Automatic Editing(体现c++STL处理字符串的能力)
- C++使用Sqlite3的简单案例
- C++走向远洋——39(指向学生类的指针)
- c++第四次上机作业
- c++第四次实验
- 整数划分问题
- LeetCode 171. Excel Sheet Column Number C语言
- LeetCode 242. Valid Anagram C语言
- LeetCode 100. Same Tree C语言
- 深入浅出--C\C++指针的本质
- C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用