首页 > 编程语言 >C++拟合多项式

C++拟合多项式

时间:2023-04-28 14:11:20浏览次数:42  
标签:std degree int 多项式 C++ double ++ vector 拟合

 

#include <iostream>
#include <vector>
#include<cmath>
#include <ctime>//eigen核心部分
#include <Eigen/Core>//稠密矩阵的代数运算(逆、特征值等)
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
/// <summary>
/// 拟合多项式
/// </summary>
/// <param name="degree">多项式的次</param>
/// <param name="x">x方向的数据点</param>
/// <param name="y">y方向的数据点</param>
/// <param name="a">多项式的系数</param>
/// <param name="R2">决定系数</param>
void Polynomial(int degree, std::vector<double> x, std::vector<double> y, std::vector<double> *a,double* R2) {
    // 生成矩阵A
    MatrixXd A(degree + 1, degree + 1);
    A.setZero();
    for (int j = 0; j < degree + 1; j++) {
        for (int i = 0; i < degree + 1; i++) {
            for (int k = 0; k < (int)x.size(); k++) {
                A(i, j) += 2 * pow(x[k], degree - j) * pow(x[k], degree - i);
            }
        }
    }
    // 生成向量B
    VectorXd B(degree + 1);
    B.setZero();
    for (int j = 0; j < degree + 1; j++) {
        for (int k = 0; k < (int)y.size(); k++) {
            B(j) += 2 * pow(x[k], degree - j) * y[k];
        }
    }

    //多项式方程组系数向量 = 矩阵A的逆 * 向量B
    VectorXd X = A.inverse() * B;
    for (int i = 0; i < X.size(); i++) {
        a->push_back(X(i));//把多项式的系数推到向量指针里
    }

    //计算决定系数R2
    double sum_y = 0.0;
    for (int i = 0; i < (int)y.size(); i++) {
        sum_y += y[i];
    }
    double mean_y = sum_y / y.size();//计算平均值
    double ssr = 0, sst = 0;
    std::vector<double> fit_y;//拟合y
    for (int i = 0; i < (int)y.size(); i++) {
        double value = 0;
        for (int n = degree; n >= 0; n--) {
            value += X(degree - n) * pow(x[i], n);//逐个计算拟合后的y
        }
        fit_y.push_back(value);//把拟合后的y推到向量里
    }
    for (int i = 0; i < (int)y.size(); i++) {
        ssr += pow(fit_y[i] - mean_y, 2);
        sst += pow(y[i] - mean_y, 2);
    }
    *R2 = ssr / sst;
}
int main(int argc, char** argv) {
    // 定义多项式的次
    int degree = 3;

    // 定义数据点
    std::vector<double> x = { 1, 2, 3 ,4, 5 };
    std::vector<double> y = { 1.1, 3.2, 6.7, 18.3, 100.3 };
    std::vector<double>* a = new std::vector<double>();;
    double R2 = 0;
    double* ptr = &R2;
    Polynomial(degree,x,y,a, ptr);
    //打印多项式系数 a0 a1... an
    int i = 0;
    for (double elem : *a) {
        cout << "a" << i++ << " = " << elem << endl;
    }
    cout << "R2 = "<< R2 << endl;
}
main.cpp

 

标签:std,degree,int,多项式,C++,double,++,vector,拟合
From: https://www.cnblogs.com/lizhiqiang0204/p/17361963.html

相关文章

  • Vulkan Support Check and Dynamic Loader C++ code sample
    很多时候不想静态依赖VulkanSDK所提供的静态库,因为会遇到一些过早的电脑不支持vulkan,那么就需要使用动态加载vulkan-1.dll(forWindows)或libMoltenVK.dylib(forMacOS)的方式进行判断了。VulkanSDK提供了相关头文件实现可以做到相关功能,仅需要include一下头文件`vulkan/vulkan.hpp......
  • C/C++ 自定义结构体直接用自定义结构体=赋值
    自定义结构体中没有管理堆空间对象的指针structst_t{inta;shortb;charc;chars[128]={0};};对比使用=和memcpy的汇编代码 结论 两者均调用了memcpy,结构体中不带指针(管理堆空间),可以直接使用浅拷贝,不过个人倾向后者,显式调用memcpy。......
  • c++打卡练习(19)
    1.问题描述相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8x8共64格的象棋棋盘说:陛下,请您赏给我一些麦子吧。就在棋盘的第1格中放1粒,第2格放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上64格,我......
  • 打卡 C++类与对象定义一个日期类 N天以后 - C/C++ 操作符重载
    改造练习13-1(日复一日)中的Date类并提交,使其可以与一个整数n相加或相减,得到该日期N天后/前的日期。提示:请参考题目(日复一日)中的Date类实现;注意考虑闰月;整数n的取值范围为[1,10000]。裁判测试程序样例: #include<iostream>#include<string>#include<assert.h>usingn......
  • c/c++零基础坐牢第九天
    c/c++从入门到入土(9)开始时间2023-04-27 19:27:23结束时间2023-04-27 23:27:35前言:哈哈,今天是五一假期前的狂欢了?不少明天没课的同学都飞奔回家咯。咳咳,都来玩星穹铁道,不玩星穹铁道都是轨子,我铁道兵要来打轨子啦!经过几天的沉淀,对函数多少有些理解,咱们今天就来进行函数编程的相......
  • C++实现一个简单的生产者-消费者队列
    本文的代码都是ChatGPT生成,我只是做了微小的调整和整合,AI提示词如下:设计一个C++类,支持生产者-消费者模型,可以通过size函数获取剩余数量可能第一次生成的不一定合适,多刷新几次。生成的ProducerConsumerQueue.h代码如下:#ifndefPRODUCER_CONSUMER_QUEUE_H#definePRODUCER_CON......
  • C++黑马程序员——P143-146. 文件操作
    P143.C++文件操作——文本文件——写文件P144.C++文件操作——文本文件——读文件P143.写文件   示例:1#include<iostream>2#include<string>3usingnamespacestd;4#include<fstream>56//文本文件写文件78voidtes......
  • C/C++会员管理系统[2023-04-27]
    C/C++会员管理系统[2023-04-27]综合设计实例四课题名称:会员管理系统I、题目的目的和要求(2-3人组)随着社会的进步,人们生活水平的提高,各种各样的会员应运而生。各种便民服务的地方为了提高服务粘性,留住顾客往往采用会员制,例如便利店、健身房,生鲜超市、美容美发店等等不一而足......
  • C++第四章课后练习题4-22
    1#include<iostream>2usingnamespacestd;3enumweekday{sunday,monday,tuesday,wednesday,thursday,friday,saturday4};5intmain()6{7inti;8weekdayd=thursday;9cout<<"d="<<d<<endl;10......
  • c++打卡练习(18)
    猜牌术魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,并使牌面朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看,魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手中的余牌,第二次......