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中Collection的使用小技巧
Aug 18 Python
python实现udp数据报传输的方法
Sep 26 Python
python基于xml parse实现解析cdatasection数据
Sep 30 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
python for 循环获取index索引的方法
Feb 01 Python
Python实现钉钉订阅消息功能
Jan 14 Python
python实现扫雷游戏
Mar 03 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
python爬虫调度器用法及实例代码
Nov 30 Python
numpy数据类型dtype转换实现
Apr 24 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 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中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
python读取中文txt文本的方法
2018/04/12 Python
python pandas生成时间列表
2019/06/29 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
标准化管理实施方案
2014/02/25 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2015国庆节感想
2015/08/04 职场文书
python 中的@运算符使用
2021/05/26 Python