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笔记(叁)继续学习
Oct 24 Python
python的urllib模块显示下载进度示例
Jan 17 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
Python中datetime常用时间处理方法
Jun 15 Python
老生常谈python中的重载
Nov 11 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
Python logging设置和logger解析
Aug 28 Python
Python常用数字处理基本操作汇总
Sep 10 Python
爬虫代理的cookie如何生成运行
Sep 22 Python
详解pycharm配置python解释器的问题
Oct 15 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数组(array)输出的三种形式详解
2013/06/05 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
图片按比例缩放函数
2006/06/26 Javascript
js类中获取外部函数名的方法
2007/08/19 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
python进行两个表格对比的方法
2018/06/27 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
小学生美德少年事迹
2014/02/02 职场文书
《狐假虎威》教学反思
2014/02/07 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
邀请书模板
2015/02/02 职场文书
同学聚会感言一句话
2015/07/30 职场文书
珍爱生命主题班会
2015/08/13 职场文书
聘用合同范本
2015/09/21 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书