利用LU分解法的多项式拟合实验

本文介绍了一种使用Jacobi迭代法求解线性方程组的方法,并将其应用于多项式拟合问题中。通过用户输入数据点,程序能够计算出最佳拟合多项式的系数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值