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生成验证码实例
Aug 21 Python
使用Python脚本对Linux服务器进行监控的教程
Apr 02 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
python networkx 根据图的权重画图实现
Jul 10 Python
Django之提交表单与前后端交互的方法
Jul 19 Python
查看Python依赖包及其版本号信息的方法
Aug 13 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python温度转换华氏温度实现代码
Dec 06 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模拟HTTP认证
2006/10/09 PHP
php5 pdo新改动加载注意事项
2008/09/11 PHP
php代码书写习惯优化小结
2013/06/20 PHP
PHP时间格式控制符对照表分享
2013/07/23 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
php批量修改表结构实例
2017/05/24 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
关于php开启错误提示的总结
2019/09/24 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
会计职业生涯规划范文
2014/01/04 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
放飞理想演讲稿
2014/09/09 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
预备党员考察意见范文
2015/06/01 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
windows安装python超详细图文教程
2021/05/21 Python