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检测网页是否有日常链接
Jun 03 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
python 爬取微信文章
Jan 30 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
python批量查询、汉字去重处理CSV文件
May 31 Python
python elasticsearch环境搭建详解
Sep 02 Python
python实现井字棋小游戏
Mar 04 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 Python
Python使用永中文档转换服务
May 06 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框架的性能
2008/01/10 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
css3 transform属性详解
2014/09/30 HTML / CSS
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
大型晚会策划方案
2014/02/06 职场文书
军校大学生个人的自我评价
2014/02/17 职场文书
品牌服务方案
2014/06/03 职场文书
宣传口号大全
2014/06/16 职场文书
技术经济专业求职信
2014/09/03 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
质检员工作总结2015
2015/04/25 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
信息简报范文
2015/07/21 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS