基于消元法的C++多项式拟合
之前查了几版多项式拟合的程序,多多少少有点问题。并且阶数上往往有明显的限制,三阶以上多项式拟合的算法较少。为了满足自己的需要,我自己写了一段可变阶数的多项式拟合算法。现在分享给大家使用。
#include <iostream>
#include <vector>
#include <math.h>
#include <assert.h>
#define ORDER_MAX 5
using namespace std;//创建矩阵
static double Array_All[ORDER_MAX][ORDER_MAX + 1];
static double coefficient[ORDER_MAX];
bool Fill_Matrix(double* P_Data_x, double* P_Data_y, int Number_Data, int Order);
bool Elimination_method(int Order);int main()
{double* P_Data_x;double* P_Data_y;double x[100];double y[100];//产生一个函数,并填充数组,检验下面的方法可行与否for (int i = 0; i < 100; i++){x[i] = i;y[i] = 1 + 10 * (double)pow(i, 1) + 1.254 * (double)pow(i, 2) + 0.5 * (double)pow(i, 3);}P_Data_x = x;P_Data_y = y;int order_used = 4;Fill_Matrix(P_Data_x, P_Data_y, 100, order_used);//填充消元法矩阵cout <<"*****************************" <<endl;//消元法计算参数Elimination_method(order_used);return 0;
}//填充矩阵
bool Fill_Matrix(double* P_Data_x, double* P_Data_y, int Number_Data, int Order)
{//y=a0+a1*x+a2*x^2+.....an*x^nfor (int i = 0; i < Order; i++){for (int j = 0; j < Number_Data; j++){Array_All[i][0] += P_Data_y[j] * pow(P_Data_x[j], i);//将Y填充到第一列}//填充系数for (int k = 0; k < Order; k++){for (int j = 0; j < Number_Data; j++){Array_All[i][k + 1] += pow(P_Data_x[j], k+i);}}for (int k = 0; k < Order+1; k++){cout << Array_All[i][k] << " ";}cout << endl;}return true;
}bool Elimination_method(int Order)
{for (int i = Order - 1; i >=0; i--){//首先归一化double D_normalization = Array_All[i][i + 1];for (int j = Order; j >= 0; j--){Array_All[i][j] /= D_normalization;}}for (int i = Order - 1; i >= 1; i--){//从后至前开始消元for (int k = 1; k <= i; k++){double D_Ratio_layer = Array_All[i - k][i + 1] / Array_All[i][i + 1];for (int j = Order; j >= 0; j--){Array_All[i - k][j] -= D_Ratio_layer * Array_All[i][j];if (j == i + 1){Array_All[i - k][j] = 0;}}}}//开始计算系数从a0->anfor (int i = 0; i < Order; i++){for (int k = i; k >=1; k--){assert(k - 1 >= 0);//断言宏,判断是否发生越界错误,保护下面数组指针Array_All[i][0] -= Array_All[i][k] * coefficient[k - 1];}coefficient[i] = Array_All[i][0] / Array_All[i][i + 1];}for (int i = 0; i < Order; i++){cout << coefficient[i] << " ";}cout << endl;return true;
}
结果如图所示:
基于消元法的C++多项式拟合相关推荐
- 基于多项式拟合的结构光系统标定
前言:上篇介绍了标准结构光系统和改进的结构光系统模型,这篇我们来讲结构光系统标定方法,结构光系统标定的方法实际上还挺多的,本篇我们只讨论分析我实现过的比较方便及运用较多的两种方法之一,我给其命名为基于 ...
- 如何确定matlab多项式拟合的阶数,基于多项式拟合函数趋势项与阶数估计加速度、速度、位移的方法与流程...
本发明属于信号处理领域,尤其涉及一种基于多项式拟合函数趋势项与阶数估计加速度.速度.位移的方法. 背景技术: 目前信号处理领域常用的加速度积分方法主要有时域积分和频域积分两种.时域积分常数项经积分会产 ...
- 结构光系统标定(三)基于多项式拟合的结构光系统标定
结构光系统标定的方法实际上还挺多的,我只讨论分析我读过且实现过的两种,两种方法都比较经典.应用较多.速度较快且操作简便的.这篇文章会讨论第一种,基于多项式拟合的结构光系统标定.当然这名字是我自己给它取 ...
- 基于numpy的多项式拟合预测人口数值
代码如下: #-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding from sklearn import line ...
- 基于MATLAB的数值微分与拟合多项式求导
目录 前言 一. 数值微分算法 中心公式一: 中心公式二: 二. 中心差分算法及其MATLAB的实现方法 例题一 三. 用插值.拟合多项式求导数 例题二 四. 二元函数的梯度计算 前言 由导数的定义得 ...
- matlab练习程序(最小二乘多项式拟合)
最近在分析一些数据,就是数据拟合的一些事情,用到了matlab的polyfit函数,效果不错. 因此想了解一下这个多项式具体是如何拟合出来的,所以就搜了相关资料. 这个文档介绍的还不错,我估计任何一本 ...
- 基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析
基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析 1 背景知识 2 实际操作部分 2.1 空间数据读取 2.2 异常数据剔除 2.3 验证集筛选 2.4 最小二乘法 ...
- 坐标系转换--椭球面多项式拟合公式转换模型变换关系理解
椭球面多项式拟合公式转换模型变换关系理解 {ΔL=a0+a1L+a2B+a3LB+a4L2+a5B2ΔB=b0+b1L+b2B+b3LB+b4L2+b5B2(1)\tag{1} \begin{dcas ...
- python 数据拟合 预测_GitHub - wanng-ide/Python-WeChat-Predict: 用现有的数据对微信公众号的一些数据做一个预测,主要采用多项式拟合来构建模型。...
Python-WeChat-Predict 用现有的数据对微信公众号的一些数据做一个预测,主要采用多项式拟合来构建模型. 概述 项目主要内容是对32个微信公众号在30天的数据进行处理,初始数据全部保存 ...
最新文章
- Nodejs教程30(完结):PM2入门
- 技本功丨呀~我不会写CSS之vertical-align(上集)
- Rust-Cargo(3)
- VTK:颜色顶点查找表用法实战
- Windows 下 MySQL-python 的安装
- 2020.8.26广联达笔试第二题——魔法师四种元素平衡(Python)
- Codeforces Beta Round #1
- 电源功耗压力测试软件,开关电源负载测试经验分享——这篇三分钟小文章着实令人“心动”...
- javaBean和Servlet的区别
- C++学习——string
- Linux学习第一篇之Linux系统安装——系统分区
- 【noi 2.6_162】Post Office(DP)
- 运算符重载的常识性问题
- 今天修了一个bug,关于debug日志的问题
- python的Bio下的Entrez使用
- 冰点还原8.57 官方中文版下载
- 三天打渔,两天晒网(java)
- 中华小子剧情介绍,中华小子在线观看
- 数字统计之统计页码数字出现的次数
- “三天打鱼,两天晒网”