#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

void print(int n, double**A,char *name) {
cout << "接下来打印矩阵" << name<<endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << A[i][j] << "   ";
}
cout << endl;
}
cout << "打印完毕" << endl;
}

void print(int n, double*s, char *name) {
cout << "接下来打印向量" << name<<endl;
for (int i = 0; i < n; i++) {
cout << s[i] << "   ";
}
cout << "打印完毕" << endl;
}

void Init(vector<double>&x,vector<double> &y) {
cout << "有多少组数据要输入:" << endl;
int num;
cin >> num;
if (num == 0) {
cout << "输入了数字0" << endl;
exit(0);
}
printf("请按行并以空格分隔输入这些数据点(例:2.5 65.8):\n");
for (int i = 0; i < num; i++) {
double a, b;
cin >> a >> b;
x.push_back(a);
y.push_back(b);
}
cout << "当前输入的数据为:" << endl;
for (int i = 0; i < num; i++) {
cout << "(" << x[i] << "," << y[i] << ")";
if ((i+1) % 5 == 0)cout << endl;
}
cout << endl;
}

void Jacobi(const int n, double *s, double *p) {
double **A;
A = new double*[n + 1];

//根据中间结果获取系数矩阵
for (int i = 0; i < n + 1; i++) {
A[i] = new double[n + 1];
for (int j = 0; j < n + 1; j++) {
A[i][j] = s[i + j];
}
}

print(n + 1, A,"A");
double error = 0.001;

//初始化
double **U, **L;
U = new double*[n + 1];
L = new double*[n + 1];
for (int i = 0; i < n + 1; i++) {
U[i] = new double[n + 1];
L[i] = new double[n + 1];
for (int j = 0; j < n + 1; j++) {
U[i][j] = 0.0;
L[i][j] = 0.0;
}
}

//计算LU矩阵
for (int k = 0; k < n + 1; k++) {
for (int j = k; j < n + 1; j++) {
double sum = 0;
for (int m = 0; m < k; m++)sum += L[k][m] * U[m][j];
U[k][j] = A[k][j] - sum;
}
if (abs(U[k][k]) < error) {
cout << "求解失败" << endl;
exit(0);
}
for (int i = k + 1; i < n + 1; i++) {
double sum = 0;
for (int m = 0; m < k; m++)sum += L[i][m] * U[m][k];
L[i][k] = (A[i][k] - sum) / U[k][k];
}
}

print(n + 1, U, "U");
print(n + 1, L, "L");

double *Y = new double[n + 1];
double *X = new double[n + 1];

//求解LY=b
Y[0] = p[0];
for (int i = 1; i < n + 1; i++) {
double sum = 0;
for (int j = 0; j <= i - 1; j++)sum += L[i][j] * Y[j];
Y[i] = p[i] - sum;
}

//求解UX=Y
X[n] = Y[n] / U[n][n];
for (int i = n-1; i >=0; i--) {
double sum = 0;
for (int j = i+1; j < n+1; j++)sum += U[i][j] * X[j];
X[i] = (Y[i] - sum)/U[i][i];
}

//输出参数
cout << "参数为:" << endl;
for (int i = 0; i < n + 1; i++) {
printf("%c=%f\n", 'a' + i, X[i]);
}
cout << endl;

//计算结果
double result = 0;
for (int i = 0; i < n + 1; i++) {
result += X[i] * pow(2010, i);
}
cout << "结果为:" << result << endl;
}

void Calculate(const int n, const vector<double>x, const vector<double> y) {

double *s = new double[2 * n + 1];
double *p = new double[n + 1];

//初始化
for (int i = 0; i < 2 * n + 1; i++)
s[i] = 0.0;
for (int i = 0; i < n + 1; i++)
p[i] = 0.0;

//保留中间结果
for (int i = 0; i < (int)x.size(); i++) {
for (int j = 0; j < n + 1; j++) {
p[j] += y[i] * pow(x[i], j);//p[i]=y*x的i次方
}
for (int j = 0; j < 2 * n + 1; j++) {
s[j] += pow(x[i], j);  //s[i]=X的i次方
}
}

print(n + 1, p,"P");

Jacobi(n,s,p);
}

int main() {
int n;
cout << "请输入需要拟合的多项式次数" << endl;
cin >> n;
vector<double>x,y;
Init(x, y);
Calculate(n, x, y);
system("pause");
}

利用LU分解法的多项式拟合实验相关推荐

  1. 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法

    紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法 标签:计算方法实验 /* 紧凑存储的杜利特尔分解法Doolittle:如果初始矩阵不要求保留的话,可以紧凑存储.因为每 ...

  2. Doolittle分解法(LU分解法)的Python实现

    在解一般的非奇异矩阵线性方程组的时候,或者在迭代改善算法中,需要使用LU分解法. 对于一个一般的非奇异矩阵A=(a11, a12,-,a1n,a21,-ann),可分解为一个下三角矩阵L和一个上三角矩 ...

  3. 计算方法:列主元消去法,LU分解法, 雅可比迭代法,高斯塞德尔迭代法 解线性方程(C++)

    Matrix.h包括矩阵类Matrix的定义,Matrix.cpp包括该类成员函数的实现,LinearEqu.h包括线性方程类LinearEqu的定义,继承自Matrix类,其中solve()方法为列 ...

  4. LU分解法 | matlab

    % LU分解法 % M为输入的增广矩阵 % precision为输入的精度要求,如不输入或输入有误,则默认为10位if nargin == 2trydigits(precision);catchdis ...

  5. 计算机数值方法——LU分解法(C++\Python代码实现)

    算法流程 首先,LU分解法就是在高斯消元法的基础上,把矩阵AAA分解为一个上三角矩阵UUU与一个单位下三角矩阵LLL的乘积. 懒得敲LaTeX公式了,书上由具体的推导过程,这里我们重点介绍代码吧 主要 ...

  6. 解线性方程组的直接方法:LU分解法及其C语言算法实现

    在上一篇博客里面,笔者介绍了解线性方程组的列主元Guass消元法,这篇将介绍LU分解法及其算法实现. 什么是LU分解? 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主 ...

  7. Matlab | Lab4——用LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代 解线性病态方程组(系数矩阵为Hilbert矩阵)

    1.要求 考虑线性方程组Hx=b,其中H为n阶Hilbert矩阵,即 通过先给定解(例如取x的各个分量为1),再计算出右端向量b的办法给出一个精确解已知的问题. (1)分别编写Doolittle LU ...

  8. Python02 雅克比迭代法 Gauss-Seidel迭代法 列选主元法 LU分解法(附代码)

    1. 实验结果 (1)在定义的矩阵类中设置需要求解的方程为: (2)在 test.py 中选择雅克比迭代法求解: 输入:最大容许迭代次数和精度要求: 输出:根据谱半径判断方法是否收敛,收敛时得到满足精 ...

  9. 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法

    对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...

  10. matlab lu解线性方程,MATLAB报告用LU分解法求解线性方程组.doc

    MATLAB报告用LU分解法求解线性方程组 <MATLAB>期末大报告 报告内容:用LU分解法求解线性方程组 学院(系): 专 业: 班 级: 学 号: 学生姓名: 2014 年 6 月 ...

最新文章

  1. 15篇论文全面概览BERT压缩方法
  2. Facebook开源模型可解释库Captum,这次改模型有依据了
  3. python自学教程读书导图-python机器学习基础教程读书笔记八(全书总结)
  4. python 多线程 廖雪峰_python中多线程与多进程中的数据共享问题
  5. Linux驱动(7)--最简单的驱动HelloWorld
  6. 对领域驱动设计的理解与实践
  7. mysql创建视图失败_mysql无法创建视图怎么办
  8. 使用selenium模拟登陆163邮箱
  9. Panel面板和三种布局管理器
  10. 对于计算机网络 其安全措施都有哪些,网络安全问题防范措施有哪些
  11. 安装软件出现提示:无法将数值写入键
  12. 计算机网络子网掩码计算题,计算机网络复习题(计算题)
  13. c语言编程情话,c语言浪漫情话
  14. 干货|TDD落地:从僵化、优化到固化的过程
  15. mysql设置不用科学记数法,关闭科学记数法MySQL
  16. 行业新生态,从区块链系统开发开始
  17. 网络营销的多种表现形式
  18. BEA-090403 Authentication for user admin denied
  19. 什么是VOIP-网络电话名词详解
  20. 日期格式之间的互相转换

热门文章

  1. 如何自动加载scratch3.0的页面上实现自动加载原有的作品
  2. android词根词缀,词根词缀记忆字典 - 好担心你们因为它的界面丑,而错过这款背单词神器 - Android 应用 - 【最美应用】...
  3. Android SoundPool循环播放
  4. java类加载器有几种_请问这几种类加载器有什么区别?
  5. DSP芯片TMS320C6678的spi挂载flash启动
  6. linux 将ext2变成ext4文件系统
  7. 3D打印Gcode文件命令详解
  8. tf data 常用操作
  9. Nginx 跨域配置支持
  10. 步进电机转速 与 pwm 关系