最小二乘法 多项式拟合 C语言实现(引用)(附echarts画图代码)_c语言多项式拟合算法-程序员宅基地

技术标签: 算法  C++  

C++多阶拟合(附echarts画图代码)

细微修改,更通用

原文章 https://blog.csdn.net/sunshineacm/article/details/79069561

/*
    本实验根据数组x[], y[]列出的一组数据,用最小二乘法求它的拟合曲线。
    近似解析表达式为y = a0 + a1 * x + a2 * x^2 + a3 * x^3;(三阶)
*/
#include <stdio.h>
#include <math.h>

#define maxn 5
#define rank_ 3 //阶数

int main()
{
    

    // double x[maxn] = {0, 0.25, 0, 5, 0.75};
    // double y[maxn] = {1, 1.283, 1.649, 2.212, 2.178};
    double x[maxn] = {
    0, 5, 10, 15, 20};//, 25, 30, 35, 40, 45, 50, 55};
    double y[maxn] = {
    0, 1.27, 2.16, 2.86, 3.44};//, 3.87, 4.15, 4.37, 4.51, 4.58, 4.02, 4.64};

    double atemp[2 * rank_ + 1] = {
    0}, b[rank_ + 1] = {
    0}, a[rank_ + 1][rank_ + 1];
    int i, j, k;

    for (i = 0; i < maxn; i++)
    {
     
        for (j = 0; j < rank_ + 1; j++)
        {
    
            b[j] += pow(x[i], j) * y[i];
        }

        for (j = 0; j < (2 * rank_ + 1); j++)
        {
    
            atemp[j] += pow(x[i], j);
        }
    }
    atemp[0] = maxn;
    for (i = 0; i < rank_ + 1; i++)
    {
     //构建线性方程组系数矩阵,b[]不变
        k = i;
        for (j = 0; j < rank_ + 1; j++)
            a[i][j] = atemp[k++];
    }
    //以下为高斯列主元消去法解线性方程组
    for (k = 0; k < rank_ + 1 - 1; k++)
    {
     //n - 1列
        int column = k;
        double mainelement = a[k][k];

        for (i = k; i < rank_ + 1; i++) //找主元素
            if (fabs(a[i][k]) > mainelement)
            {
    
                mainelement = fabs(a[i][k]);
                column = i;
            }
        for (j = k; j < rank_ + 1; j++)
        {
     //交换两行
            double atemp = a[k][j];
            a[k][j] = a[column][j];
            a[column][j] = atemp;
        }
        double btemp = b[k];
        b[k] = b[column];
        b[column] = btemp;

        for (i = k + 1; i < rank_ + 1; i++)
        {
     //消元过程
            double Mik = a[i][k] / a[k][k];
            for (j = k; j < rank_ + 1; j++)
                a[i][j] -= Mik * a[k][j];
            b[i] -= Mik * b[k];
        }
    }
    b[rank_ + 1 - 1] /= a[rank_ + 1 - 1][rank_ + 1 - 1]; //回代过程
    for (i = rank_ + 1 - 2; i >= 0; i--)
    {
    
        double sum = 0;
        for (j = i + 1; j < rank_ + 1; j++)
            sum += a[i][j] * b[j];
        b[i] = (b[i] - sum) / a[i][i];
    }
    //高斯列主元消去法结束,输出
    printf("P(x) = %f%+fx%+fx^2%+fx^3\n\n", b[0], b[1], b[2], b[3]);
    return 0;
}

#Echarts做的图(要先下echarts.min.js,记得勾选散点图)
echarts画的模拟图
html部分

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<title>test</title>
		<meta charset="utf-8" />
		<meta name="renderer" content="webkit" />
	</head>
	<body>
		<div id="Graph" style="width: 800px;height: 500px;">123</div>
	</body>
	<script src="echarts.min.js?ver="></script>
	<script src="index.js?ver="></script>
</html>

js部分

draw();

function f1(x) {
    //二阶拟合
	let y = 0.230467 + 0.203691 * x - 0.002381 * x * x;
	return y;
}

function f3(x) {
    //三阶
	let y = 0.017839 + 0.263399 * x - 0.005216 * x * x + 0.000034 * x * x * x;
	return y;
}

function f4(x) {
    //二阶,数据减少为5个
	return (0.027714 + 0.259114 * x - 0.004486 * x * x) // + 0.000034 * x * x * x;
}

function draw() {
    

	let x = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
	let y = [0, 1.27, 2.16, 2.86, 3.44, 3.87, 4.15, 4.37, 4.51, 4.58, 4.02, 4.64];

	let data = [];
	let data2 = []
	let data3 = []
	let data4 = []

	for (let idx in x) {
    
		let a = [];
		a.push(x[idx]);
		a.push(y[idx]);
		data.push(a);


		let b = [];
		b.push(x[idx]);
		b.push(f1(x[idx]))
		data2.push(b);

		let c = [];
		c.push(x[idx]);
		c.push(f3(x[idx]))
		data3.push(c);

		let c4 = [];
		c4.push(x[idx]);
		c4.push(f4(x[idx]))
		data4.push(c4);

	}

	let option = {
    
		tooltip: {
    
			trigger: 'axis',
			axisPointer: {
     // 坐标轴指示器,坐标轴触发有效
				type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
			}
		},
		legend: {
    
			data: ['原数据', '二阶', '三阶', '二阶5数据', "5"]
		},
		xAxis: {
    },
		yAxis: {
    },
		series: [{
    
				symbolSize: 10,
				data: data,
				type: 'scatter',
				name: '原数据'
			},

			{
    
				symbolSize: 10,
				data: data2,
				type: 'scatter',
				name: '二阶'
			},

			{
    
				symbolSize: 10,
				data: data3,
				type: 'scatter',
				name: '三阶'
			},
			{
    
				symbolSize: 10,
				data: data4,
				type: 'scatter',
				name: '二阶5数据'
			},

		]
	};

	// 基于准备好的dom,初始化echarts实例
	var myChart = echarts.init(document.getElementById('Graph'));
	myChart.setOption(option);
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012565113/article/details/106996382

智能推荐

BASE64、MD5、SHA、HMAC几种加密算法-程序员宅基地

文章浏览阅读106次。BASE64编码算法不算是真正的加密算法。 MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。 BASE64 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The ..._base 64编码 和mad5 和雪花算法

住宅IP、家庭宽带IP以及原生IP,它们有什么区别?谷歌开发者账号应选择哪种IP?-程序员宅基地

文章浏览阅读1.1k次。IP地址(Internet Protocol Address)是互联网协议地址的简称,是互联网通信的基础,互联网上每一个网络设备的唯一标识符每个在线的设备都需要一个IP地址,这样才能在网络中找到它们并进行数据交换。IP地址有很多种类型,今天跟大家简单分享一下住宅IP、家庭宽带IP以及原生IP的区别。住宅IP通常是指由互联网服务提供商(ISP)分配给家庭的或小型办公室使用的互联网连接IP地址,并可能随着网络连接的变化而变化。此类IP地址主要用于日常网络活动,如浏览网页、发送接收电子邮件、上网冲浪等。

如何更改layui form表单位置,宽度,颜色等_layui-form-item 宽度-程序员宅基地

文章浏览阅读2.6w次,点赞14次,收藏30次。如何更改layui form表单位置,宽度,颜色等_layui-form-item 宽度

【翻译】Efficient Data Loader for Fast Sampling-Based GNN Training on Large Graphs_pagraph: scaling gnn training on large graphs via -程序员宅基地

文章浏览阅读612次。写的非常好_pagraph: scaling gnn training on large graphs via computation-aware caching

炫酷的HTML代码-程序员宅基地

文章浏览阅读2.7w次,点赞61次,收藏285次。很炫酷的html代码:<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><title>star</title><script type="text/javascript">window.onload = function () {C = Math.cos; // cache Math objectsS = Math.si.._炫酷的html

【HDU - 1166】敌兵布阵 (线段树模板 单点更新+ 区间查询)-程序员宅基地

文章浏览阅读204次。题干:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 中央情报局要研究敌人究竟演习什...

随便推点

【免费题库】华为OD机试C卷 - 数字字符串组合倒序(Java 代码+解析)-程序员宅基地

文章浏览阅读2.3k次。题目描述对数字,字符,数字串,字符串,以及数字与字符串组合进行倒序排列。字符范围:由 a 到 z, A 到 Z,数字范围:由 0 到 9符号的定义:“-”作为连接符使用时作为字符串的一部分,例如“20-years”作为一个整体字符串呈现;连续出现 2 个 “-” 及以上时视为字符串间隔符,如“out--standing”中的”–“视为间隔符,是 2 个独立整体字符串”out”和”standing”;除了 1,2 里面定义的字符以外其他的所有字符,都是非法字符,作为字符串的间隔符处理,倒序后

Android(14) ArrayAdapter(数组适配器)的三种方法-程序员宅基地

文章浏览阅读5w次,点赞36次,收藏138次。ArrayAdapter数组适配器用于绑定格式单一的数据,数据源可以是集合或者数组列表视图(ListView)以垂直的形式列出需要显示的列表项。实现过程:新建适配器->添加数据源到适配器->视图加载适配器第一种:直接用ListView组件创建列表每一行只有一行文字效果如图:activity_list布局:<?xml version="1.0" e..._arrayadapter

助力商家健康经营 创业者为水滴直播点赞-程序员宅基地

文章浏览阅读43次。近日,水滴直播平台登上了舆论的风口浪尖。有人认为水滴直播涉嫌侵犯隐私,但也有人表示这种互联网新生事物可以有效规避很多风险,值得鼓励,不应一棒子打死。记者采访时发现,很多商家、创业者对于水滴直播纷纷表示支持,并直言水滴直播为他们的经营带来了很大帮助。 邹志泉在北京丰台区经营着一家批发厂家直销男女内衣裤的店铺,平时就打开水滴直播,分享他在店铺的经营画面。面对水滴直播涉及隐私的提问,邹志泉明确表...

java毕业设计宠物收养管理系统Mybatis+系统+数据库+调试部署-程序员宅基地

文章浏览阅读67次。springboot基于SpringBoot的电影社区网站。springboot基于springboot食品销售网站。ssm基于微信平台的校园汉服租赁系统的设计与实现。ssm基于SSM高校教师个人主页网站的设计与实现。ssm基于SSM框架的在线健康系统设计与实现。ssm基于HTML的武昌理工学院二手交易网站。ssm基于JavaEE的网上图书分享系统。ssm基于Javaee的项目任务跟踪系统。

Nginx使用之反向代理、负载均衡、动静分离教程。_php动静分离-程序员宅基地

文章浏览阅读61次。负载均衡是指将客户端的请求分发到多个后端服务器,以平衡服务器的负载。反向代理是指将客户端的请求转发到后端服务器,并将响应返回给客户端。通过配置反向代理,Nginx将转发所有来自客户端的请求到后端服务器,并将响应返回给客户端。通过这样的配置,Nginx将根据请求的URL路径选择是将请求转发到后端服务器还是直接返回静态资源文件。通过配置负载均衡,Nginx将按照指定的策略将客户端的请求分发到后端服务器上,从而实现负载均衡。配置反向代理:编辑Nginx配置文件(通常是nginx.conf),在。_php动静分离

HTML5有哪些新特性_谈谈html5的一些新特性-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏18次。(一) 语义标签(二)增强型表单(三)视频和音频(四)Canvas绘图(五)SVG绘图(六)地理定位(七)拖放API(八) WebWorker(九) WebStorage(十)Web..._谈谈html5的一些新特性

推荐文章

热门文章

相关标签