Python实现曲线拟合的最小二乘法


Posted in Python onFebruary 19, 2021

本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下

模块导入

import numpy as np
import gaosi as gs

代码

"""
本函数通过创建增广矩阵,并调用高斯列主元消去法模块进行求解。

"""
import numpy as np
import gaosi as gs

shape = int(input('请输入拟合函数的次数:'))

x = np.array([0.6,1.3,1.64,1.8,2.1,2.3,2.44])
y = np.array([7.05,12.2,14.4,15.2,17.4,19.6,20.2])
data = []
for i in range(shape*2+1):
 if i != 0:
 data.append(np.sum(x**i))
 else:
 data.append(len(x))
b = []
for i in range(shape+1):
 if i != 0:
 b.append(np.sum(y*x**i))
 else:
 b.append(np.sum(y))
b = np.array(b).reshape(shape+1,1)
n = np.zeros([shape+1,shape+1])
for i in range(shape+1):
 for j in range(shape+1):
 n[i][j] = data[i+j]
result = gs.Handle(n,b)
if not result:
 print('增广矩阵求解失败!')
 exit()
fun='f(x) = '
for i in range(len(result)):
 if type(result[i]) == type(''):
 print('存在自由变量!')
 fun = fun + str(result[i])
 elif i == 0:
 fun = fun + '{:.3f}'.format(result[i])
 else:
 fun = fun + '+{0:.3f}*x^{1}'.format(result[i],i)
print('求得{0}次拟合函数为:'.format(shape))
print(fun)

高斯模块

# 导入 numpy 模块
import numpy as np


# 行交换
def swap_row(matrix, i, j):
 m, n = matrix.shape
 if i >= m or j >= m:
 print('错误! : 行交换超出范围 ...')
 else:
 matrix[i],matrix[j] = matrix[j].copy(),matrix[i].copy()
 return matrix


# 变成阶梯矩阵
def matrix_change(matrix):
 m, n = matrix.shape
 main_factor = []
 main_col = main_row = 0
 while main_row < m and main_col < n:
 # 选择进行下一次主元查找的列
 main_row = len(main_factor)
 # 寻找列中非零的元素
 not_zeros = np.where(abs(matrix[main_row:,main_col]) > 0)[0]
 # 如果该列向下全部数据为零,则直接跳过列
 if len(not_zeros) == 0:
 main_col += 1
 continue
 else:
 # 将主元列号保存在列表中
 main_factor.append(main_col)
 # 将第一个非零行交换至最前
 if not_zeros[0] != [0]:
 matrix = swap_row(matrix,main_row,main_row+not_zeros[0])
 # 将该列主元下方所有元素变为零
 if main_row < m-1:
 for k in range(main_row+1,m):
 a = float(matrix[k, main_col] / matrix[main_row, main_col])
 matrix[k] = matrix[k] - matrix[main_row] * matrix[k, main_col] / matrix[main_row, main_col]
 main_col += 1
 return matrix,main_factor


# 回代求解
def back_solve(matrix, main_factor):
 # 判断是否有解
 if len(main_factor) == 0:
 print('主元错误,无主元! ...')
 return None
 m, n = matrix.shape
 if main_factor[-1] == n - 1:
 print('无解! ...')
 return None
 # 把所有的主元元素上方的元素变成0
 for i in range(len(main_factor) - 1, -1, -1):
 factor = matrix[i, main_factor[i]]
 matrix[i] = matrix[i] / float(factor)
 for j in range(i):
 times = matrix[j, main_factor[i]]
 matrix[j] = matrix[j] - float(times) * matrix[i]
 # 先看看结果对不对
 return matrix


# 结果打印
def print_result(matrix, main_factor):
 if matrix is None:
 print('阶梯矩阵为空! ...')
 return None
 m, n = matrix.shape
 result = [''] * (n - 1)
 main_factor = list(main_factor)
 for i in range(n - 1):
 # 如果不是主元列,则为自由变量
 if i not in main_factor:
 result[i] = '(free var)'
 # 否则是主元变量,从对应的行,将主元变量表示成非主元变量的线性组合
 else:
 # row_of_main表示该主元所在的行
 row_of_main = main_factor.index(i)
 result[i] = matrix[row_of_main, -1]
 return result


# 得到简化的阶梯矩阵和主元列
def Handle(matrix_a, matrix_b):
 # 拼接成增广矩阵
 matrix_01 = np.hstack([matrix_a, matrix_b])
 matrix_01, main_factor = matrix_change(matrix_01)
 matrix_01 = back_solve(matrix_01, main_factor)
 result = print_result(matrix_01, main_factor)
 return result


if __name__ == '__main__':
 a = np.array([[2, 1, 1], [3, 1, 2], [1, 2, 2]],dtype=float)
 b = np.array([[4],[6],[5]],dtype=float)
 a = Handle(a, b)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python批量下载抖音视频
Jun 17 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
softmax及python实现过程解析
Sep 30 Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
Feb 19 #Python
python绘制高斯曲线
Feb 19 #Python
Python绘制数码晶体管日期
Feb 19 #Python
Python Pygame实现俄罗斯方块
Feb 19 #Python
python实现图片转字符画
Feb 19 #Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 #Python
python 基于DDT实现数据驱动测试
Feb 18 #Python
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP 字符串分割和比较
2009/10/06 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
Augularjs-起步详解
2016/07/08 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
在python image 中实现安装中文字体
2020/05/16 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
给排水专业应届生求职信
2013/10/12 职场文书
应届大学生自荐信
2013/12/05 职场文书
办公室内勤工作职责
2013/12/11 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
活动总结范文
2014/08/30 职场文书
假释思想汇报范文
2014/10/11 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python