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中处理字符串之isalpha()方法的使用
May 18 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
基于python检查矩阵计算结果
May 21 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
Javascript - HTML的request类
2007/01/09 Javascript
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
python模块之time模块(实例讲解)
2017/09/13 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
python 函数中的参数类型
2020/02/11 Python
Python多线程正确用法实例解析
2020/05/30 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
银行职员自我鉴定
2014/04/20 职场文书
个人存款证明书
2014/10/18 职场文书
担保书范本
2015/01/20 职场文书
大学生村官个人总结
2015/02/15 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
感恩主题班会教案
2015/08/12 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android