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 相关文章推荐
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
解决python 无法加载downsample模型的问题
Oct 25 Python
python文本数据处理学习笔记详解
Jun 17 Python
Python实现FM算法解析
Jun 18 Python
python调试神器PySnooper的使用
Jul 03 Python
python Django的web开发实例(入门)
Jul 31 Python
使用Python进行中文繁简转换的实现代码
Oct 18 Python
python使用多线程+socket实现端口扫描
May 28 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
python3实现飞机大战
Nov 29 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学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
javascript 异常处理使用总结
2009/06/21 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
python通过函数属性实现全局变量的方法
2015/05/16 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
美国智能家居专家:tink
2019/06/04 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
大学生的网络创业计划书
2013/12/26 职场文书
趣味运动会活动方案
2014/02/12 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
生物学专业求职信
2014/07/23 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书
小学班级管理心得体会
2016/01/07 职场文书
话题作文之诚信
2019/11/28 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python