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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
python使用多进程的实例详解
Sep 19 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
使用 Python 处理 JSON 格式的数据
Jul 22 Python
Python selenium的基本使用方法分析
Dec 21 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
python自动脚本的pyautogui入门学习
Apr 01 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之COOKIE支持详解
2010/09/20 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
php实现mysql封装类示例
2014/05/07 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
javascript获取当前ip的代码
2009/05/10 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
详解vue高级特性
2020/06/09 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Python @property装饰器原理解析
2020/01/22 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
团购业务员岗位职责
2014/03/15 职场文书
病媒生物防治方案
2014/05/13 职场文书
党员群众路线承诺书
2014/05/20 职场文书
销售提升方案
2014/06/07 职场文书
迎新生标语大全
2014/10/06 职场文书
党支部考察意见范文
2015/06/02 职场文书
小学大队长竞选稿
2015/11/20 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书