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中MySQLdb模块用法实例
Nov 10 Python
python使用post提交数据到远程url的方法
Apr 29 Python
常见python正则用法的简单实例
Jun 21 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
python os模块简单应用示例
May 23 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
通过实例解析Python调用json模块
Dec 11 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 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的5个入手程序
2006/11/23 PHP
PHP 翻页 实例代码
2009/08/07 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
php简单截取字符串代码示例
2016/10/19 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
JavaScript类库D
2010/10/24 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
django中瀑布流写法实例代码
2019/10/14 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
阿里云:Aliyun.com
2017/02/15 全球购物
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
毕业生护理专业个人求职信范文
2014/01/04 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
精神文明建设标语
2014/06/16 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
学校学期工作总结
2015/08/13 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis