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系列之教你如何根据图片生成字符画
May 23 Python
Python中处理时间的几种方法小结
Apr 09 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
简介二分查找算法与相关的Python实现示例
Aug 26 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
python组合无重复三位数的实例
Nov 13 Python
解析Python的缩进规则的使用
Jan 16 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
Django 构建模板form表单的两种方法
Jun 14 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
粗暴解决CUDA out of memory的问题
May 22 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
深入php内核之php in array
2015/11/10 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
Python换行与不换行的输出实例
2020/02/19 Python
django实现日志按日期分割
2020/05/21 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
工作自荐信
2013/12/11 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
民间借贷借条如何写
2015/05/26 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB