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将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python获取Windows或Linux主机名称通用函数分享
Nov 22 Python
python将ip地址转换成整数的方法
Mar 17 Python
python web框架学习笔记
May 03 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
Python实现求一个集合所有子集的示例
May 04 Python
实用自动化运维Python脚本分享
Jun 04 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
Django和Flask框架优缺点对比
Oct 24 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
PHP学习笔记之数组篇
2011/06/28 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python二分法实现实例
2013/11/21 Python
python调用java的Webservice示例
2014/03/10 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
python用requests实现http请求代码实例
2019/10/31 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
参观监狱心得体会
2014/01/02 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
联谊活动总结
2014/08/28 职场文书
中英文求职信范文
2015/03/19 职场文书
公司车辆管理制度
2015/08/04 职场文书
期中考试后的感想
2015/08/07 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
Redis Stream类型的使用详解
2021/11/11 Redis