【科学计算语言】实验四 科学计算与可视化

【目的和要求】

(1)理解科学计算实质并掌握Python语言的科学计算应用

(2)掌握常用科学计算库

(3)熟练运用numpy及scipy、matplotlib等计算库资源 

【实验准备】

Python核心科学计算库的导入、配置并熟悉相关对象

【实验内容】

1. 实验练习:Numpy 应用包

NumPy 中除了可以使用 numpy.transpose 函数来对换数组的维度,还可以使用 T 属性。。

例如有个 m 行 n 列的矩阵,使用 t() 函数就能转换为 n 行 m 列的矩阵。

实例

import numpy as np a = np.arange(12).reshape(3,4) print ('原数组:') print (a) print ('\n') print ('转置数组:') print (a.T)

输出结果如下:

原数组:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

转置数组:

[[ 0 4 8]

[ 1 5 9]

[ 2 6 10]

[ 3 7 11]]

matlib.empty()

matlib.empty() 函数返回一个新的矩阵,语法格式为:

numpy.matlib.empty(shape, dtype, order)

参数说明:

  1. shape: 定义新矩阵形状的整数或整数元组
  2. Dtype: 可选,数据类型
  3. order: C(行序优先) 或者 F(列序优先)

实例

import numpy.matlib import numpy as np print (np.matlib.empty((2,2))) # 填充为随机数据

输出结果为:

[[-1.49166815e-154 -1.49166815e-154]

[ 2.17371491e-313 2.52720790e-212]]

numpy.matlib.zeros()

numpy.matlib.zeros() 函数创建一个以 0 填充的矩阵。

实例

import numpy.matlib import numpy as np print (np.matlib.zeros((2,2)))

输出结果为:

[[0. 0.]

[0. 0.]]

numpy.matlib.ones()

numpy.matlib.ones()函数创建一个以 1 填充的矩阵。

实例

import numpy.matlib import numpy as np print (np.matlib.ones((2,2)))

输出结果为:

[[1. 1.]

[1. 1.]]

numpy.matlib.eye()

numpy.matlib.eye() 函数返回一个矩阵,对角线元素为 1,其他位置为零。

numpy.matlib.eye(n, M,k, dtype)

参数说明:

  1. n: 返回矩阵的行数
  2. M: 返回矩阵的列数,默认为 n
  3. k: 对角线的索引
  4. dtype: 数据类型

实例

import numpy.matlib import numpy as np print (np.matlib.eye(n = 3M = 4k = 0dtype = float))

输出结果为:

[[1. 0. 0. 0.]

[0. 1. 0. 0.]

[0. 0. 1. 0.]]

numpy.matlib.identity()

numpy.matlib.identity() 函数返回给定大小的单位矩阵。

单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,除此以外全都为 0。

实例

import numpy.matlib import numpy as np # 大小为 5,类型位浮点型 print (np.matlib.identity(5dtype = float))

输出结果为:

[[ 1. 0. 0. 0. 0.]

[ 0. 1. 0. 0. 0.]

[ 0. 0. 1. 0. 0.]

[ 0. 0. 0. 1. 0.]

[ 0. 0. 0. 0. 1.]]

numpy.matlib.rand()

numpy.matlib.rand() 函数创建一个给定大小的矩阵,数据是随机填充的。

实例

import numpy.matlib import numpy as np print (np.matlib.rand(3,3))

输出结果为:

[[0.23966718 0.16147628 0.14162 ]

[0.28379085 0.59934741 0.62985825]

[0.99527238 0.11137883 0.41105367]]

矩阵总是二维的,而 ndarray 是一个 n 维数组。 两个对象都是可互换的。

实例

import numpy.matlib import numpy as np i = np.matrix('1,2;3,4') print (i)

输出结果为:

[[1 2]

[3 4]]

实例

import numpy.matlib import numpy as np j = np.asarray(i) print (j)

输出结果为:

[[1 2]

[3 4]]

实例

import numpy.matlib import numpy as np k = np.asmatrix (j) print (k)

输出结果为:

[[1 2]

[3 4]]

2实验练习:Numpy 切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

实例

import numpy as np a = np.arange(10) s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2 print (a[s])

输出结果为:

[2 4 6]

以上实例中,我们首先通过 arange() 函数创建 ndarray 对象。 然后,分别设置起始,终止和步长的参数为 2,7 和 2。

我们也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作:

实例

import numpy as np a = np.arange(10) b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2 print(b)

输出结果为:

[2 4 6]

冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。

实例

import numpy as np a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9] b = a[5] print(b)

输出结果为:

5

实例

import numpy as np a = np.arange(10) print(a[2:])

输出结果为:

[2 3 4 5 6 7 8 9]

实例

import numpy as np a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9] print(a[2:5])

输出结果为:

[2 3 4]

多维数组同样适用上述索引提取方法:

实例

import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print(a) # 从某个索引处开始切割 print('从数组索引 a[1:] 处开始切割') print(a[1:])

输出结果为:

[[1 2 3]

[3 4 5]

[4 5 6]]

从数组索引 a[1:] 处开始切割

[[3 4 5]

[4 5 6]]

切片还可以包括省略号 ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

实例

import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print (a[...,1]) # 第2列元素 print (a[1,...]) # 第2行元素 print (a[...,1:]) # 第2列及剩下的所有元素

输出结果为:

[2 4 5]

[3 4 5]

[[2 3]

[4 5]

[5 6]]

3. scipy库应用:scipy.cluster 聚类scipy.constants 数学常量scipy.fft 快速傅里叶变换scipy.integrate 积分scipy.interpolate 插值scipy.io 数据输入输出scipy.linalg 线性代数scipy.misc 图像处理scipy.ndimage N 维图像scipy.odr 正交距离回归scipy.optimize 优化算法scipy.signal 信号处理scipy.sparse 稀疏矩阵scipy.spatial 空间数据结构和算法scipy.special 特殊数学函数scipy/stats 统计函数

以上为scipy子库,请同学熟悉库名

实例求解f(x)=2*sin(x)-x+1参考程序:

def f1(x):

       return np.sin(x)*2-x+1

value = fsolve(f1,[2])

print(value)

4.Numpy实例 卫星GPS定位

 上述6个卫星S1-S6和地球在高速运动,从卫星发出的位置信息以光速传输到GPS接收端需要一定的时间。  假设(x,y,z,t)表示R当前的位置, t是R的相对时间,卫星S1(发出信号时刻)到(当前接收时刻)满足以下关系(其中c是光速)。 (x-3)^2 + (y-2)^2 + (z-3)^2 = [(10010.00692286 – t)*c]^2, 该公式表示以(x, y, z,t)为参数的(欧式空间距离)与信号传输距离相等。对于卫星S1,S2,…,S6,满足方程组:...(1)

其中,光速为常数c=0.299792458km/us,上述方程组是非线性的,但很容易将所有二次项都消去(每个公式减去第一个公式),从而得到:

此时,上述等式变成了A*X=B形式,根据线性代数方法,X=A-1*B,即只需对系数矩阵求逆,再乘以常数矩阵便可以得到方程组的解。GPS定位的问题建模: 上面给出了GPS的定位原理,如何利用计算机辅助GPS的定位计算呢? 以6颗卫星为例,GPS定位计算问题的IPO模式----描述如下: 输入:6颗卫星的欧式坐标和信号时间戳 处理:GPS定位算法 输出:GPS接收设备的地理坐标和当前时间假设第i颗卫星的坐标和时间戳表示为(x_i, y_i ,z_i ,t_i ),结合上述例子,GPS定位算法可以描述为如下公式:

下面将使用Numpy函数库实现上述矩阵操作。程序中用到的函数:

numpy.dot(a,b):计算矩阵a与矩阵b的点积

numpy.linalg.inv(a):求矩阵a 的逆矩阵

GPS定位的程序实现 Python代码如下: 其中zeros是NumPy提供的函数,用来建立指定维度的数组, zeros用来生成数组x用来存储接受来自外部输入的六颗卫星坐标, 数组a,b用来存放前面算法中的系数矩阵,

参考程序:【请阅读并分析写出主要代码】

from numpy import *

def main_GPSLocation():

    i = 1

    c = 0.299792458  # 光速 0.299792458km/us

    x = zeros((6, 4)) #存储6个卫星的(x,y,z,t)参数

    while i<=6:

        print(" %s %d" % ("please input (x,y,z,t) of group",i) )

        temp=input()

        x[i-1]=temp.split()

        j=0

        while j<4:

            x[i-1][j]=float(x[i-1][j])

            j=j+1

        i=i+1

    a=zeros((4,4)) #系数矩阵

    b=zeros((4,1)) #常数项

    j=0

    while j<4:

        a[j][0]=2*(x[5][0]-x[j][0])

        a[j][1]=2*(x[5][1]-x[j][1])

        a[j][2]=2*(x[5][2]-x[j][2])

        a[j][3]=2*c*c*(x[j][3]-x[5][3])

        b[j][0]=x[5][0] * x[5][0] - x[j][0] * x[j][0] + \

                x[5][1] * x[5][1] - x[j][1] * x[j][1] + \

                x[5][2] * x[5][2] - x[j][2] * x[j][2] + \

            c*c*(x[j][3] * x[j][3] - x[5][3] * x[5][3])

        j=j+1

    a_ni=linalg.inv(a) #系数矩阵求逆

    print(dot(a_ni,b))

main_GPSLocation()

【思考题】

  1. 请思考Python numpy库中针对数组的操作与列表、元组等序列数据处理有何联系及区别?
  2. 如果想在scipy子库linalg中增加一些针对矩阵的处理代码,如何实现?请谈谈自己的。

Python的NumPy库提供了对数组进行高效处理的功能,与列表和元组等序列数据处理有着联系和区别。

联系:

  • 数据处理:NumPy的数组(numpy.array)和Python的列表(list)都可以存储多个元素,并进行索引、切片等操作。
  • 元素访问:两者都可以通过索引访问元素,但NumPy数组支持更多的高效操作,例如支持向量化操作和广播。
  • 数据类型:NumPy数组可以指定特定的数据类型(例如int32float64等),而列表则可以包含不同类型的对象。

区别:

  • 性能:NumPy数组在执行数值计算时通常比Python列表更高效,因为NumPy是基于C语言编写的,拥有更多的优化和内置函数。
  • 维度:NumPy数组可以是多维的(例如二维矩阵),而Python列表通常是一维的,可以嵌套以实现多维效果。
  • 功能:NumPy提供了许多数学和统计函数,例如求和、平均值、矩阵乘法等,这些函数对于数组操作非常方便。

关于在SciPy子库(比如scipy.linalg)中增加针对矩阵处理的代码,一般可以通过以下步骤实现:

  1. 了解子库的结构和需求:首先需要深入了解scipy.linalg子库中已有的功能和提供的矩阵处理方法,确保你的添加是有意义且没有重复的。

  2. 贡献代码:你可以参考SciPy的贡献指南,一般来说,你可以先在GitHub上找到SciPy仓库,进行Fork,然后修改代码并提交Pull Request。在修改代码之前,最好先在邮件列表或者GitHub上提出你的想法,以便其他开发者提供反馈和指导。

  3. 编写文档和测试:编写清晰的文档说明你添加的新功能,包括用法、示例和可能的注意事项。同时,编写测试用例来验证新功能的正确性和稳定性。

  4. 遵循社区规范:在贡献代码时,遵循SciPy项目的代码风格、规范和最佳实践,确保你的代码与现有代码风格一致,并通过项目的审核和测试流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/263132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LangChain入门指南:定义、功能和工作原理

LangChain入门指南&#xff1a;定义、功能和工作原理 引言LangChain是什么&#xff1f;LangChain的核心功能LangChain的工作原理LangChain实际应用案例如何开始使用LangChain 引言 在人工智能的浪潮中&#xff0c;语言模型已成为推动技术革新的重要力量。从简单的文本生成到复…

内皮素-1(Endothelin-1 )ELISA kit

灵敏、快速的内皮素-1 ELISA试剂盒&#xff0c;适用于心血管和应激相关研究 内皮素&#xff08;Endothelin, ET&#xff09;是由血管内皮细胞产生的异肽&#xff0c;具有强大的血管收缩活性。这种肽由三个独立的基因编码&#xff0c;经过加工产生39个残基的 大ET 分子&#xff…

【JS】事件循环机制

一、JS单线程、异步、同步概念 众所周知&#xff0c;JS是单线程&#xff08;如果一个线程删DOM&#xff0c;一个线程增DOM&#xff0c;浏览器傻逼了&#xff5e;所以只能单着了&#xff09;&#xff0c;虽然有webworker酱紫的多线程出现&#xff0c;但也是在主线程的控制下。we…

Prompt-to-Prompt:基于 cross-attention 控制的图像编辑技术

Hertz A, Mokady R, Tenenbaum J, et al. Prompt-to-prompt image editing with cross attention control[J]. arXiv preprint arXiv:2208.01626, 2022. Prompt-to-Prompt 是 Google 提出的一种全新的图像编辑方法&#xff0c;不同于任何传统方法需要用户指定编辑区域&#xff…

大一C语言作业题目2

目录 字符串&#xff1f; struct&#xff1f; index细节&#xff1f; scanf细节&#xff1f; 7-2 找出总分最高的学生 给定N个学生的基本信息&#xff0c;包括学号&#xff08;由5个数字组成的字符串&#xff09;、姓名&#xff08;长度小于10的不包含空白字符的非空字符…

转义字符使用详解【C语言】

目录 转义字符的概念 转义字符表 转义字符详解 和 实际使用示例 一、\a 二、\b 三、\f 四、\n 五、\r 六、\t 七、\v 八、\\ 九、\ 十、\" 十一、\? 十二、\0 十三、\ddd 十四、\xhh 总结—— 转义字符的概念 所有的 ASCII码都可以用“\加数字” 来表示…

Shell编程自动化之特殊Shell扩展变量

1.变量的处理 1.1 如果parameter变量值为空&#xff0c;那么返回str字符串。 ${parameter:-str} 1.2 如果parameter变量值为空&#xff0c;那么str替代变量值&#xff0c;且返回其值。 ${parameter:str} 1.3 如果parameter变量值为空&#xff0c;那么str当作stderr输出&am…

数据库关系图,如何连接mysql,编码集和校验集,创建/删除/选择/修改/备份/恢复数据库,数据库本质,查看数据库连接

目录 数据库服务器、数据库和表的关系 连接服务 库的操作 查看数据库 编码格式 编码集 校验集 查看支持的规则 查看系统默认规则 查看默认编码集 查看默认校验集 查看各种服务的默认校验集 创建数据库 if not exists 指定格式创建数据库 设置编码集 设置校验集…

安装gnvm,nodejs,npm使用方法

安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址&#xff1a; https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录&#xff0c;如&#xff1a;d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理

于NI kb摘录 1.概述 对于NI RIO系列设备&#xff08;CompactRIO、sbRIO、myRIO等&#xff09;进行编程时&#xff0c;需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”&#xff0c;为用户提供图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于监控系统…

RabbitMQ笔记(基础篇)

RabbitMQ笔记_基础篇 MQ基本概念1. MQ概述2. MQ的优势和劣势2.1 优势☆2.2 劣势2.3 使用 MQ 需要满足什么条件呢&#xff1f; 3. 常见的MQ产品 RabbitMQ基本介绍1. RabbitMQ 基础架构2. RabbitMQ 中的相关概念3. RabbitMQ的6 种工作模式☆4. AMQP 和 JMS4.1 AMQP4.2 JMS4.3 AMQ…

关于“Python”的核心知识点整理大全35

目录 13.3.4 重构 create_fleet() game_functions.py 13.3.5 添加行 game_functions.py alien_invasion.py 13.4 让外星人群移动 13.4.1 向右移动外星人 settings.py alien.py alien_invasion.py game_functions.py 13.4.2 创建表示外星人移动方向的设置 13.4.3 检…

[c]定位查找

本题需要注意的是多组测试&#xff0c;输入一组测试&#xff0c;输出一个值 下面附上代码 #include<stdio.h> int main() {int n,tmp,count;int arr[20];while(scanf("%d",&n)!EOF){count0;for(int i0;i<n;i){scanf("%d",&arr[i]);}sca…

【数据结构】九、排序

目录 一、排序概述 二、插入排序 2.1直接插入排序 2.2折半插入排序 2.3二路插入排序 2.4表插入排序 2.5希尔排序 三、交换排序 3.1冒泡排序 3.2快速排序 四、选择排序 4.1简单选择排序 4.2锦标赛排序 4.3堆排序 五、归并排序 六、基数排序 七、总结 一、排序概述…

DBeaver连接国产数据库的步骤

驱动配置 第一次安装过DBeaver之后&#xff0c;配置下驱动仓库&#xff0c;安装下图所示操作。 添加马爸爸的maven库连接地址 id&#xff1a; maven.aliyun.com 名称&#xff1a; maven.aliyun.com url&#xff1a; https://maven.aliyun.com/repository/central/ 或者 ht…

TCP协议:可靠传输的基石

目录 1. 数据完整性的保证 2. 数据的有序传输 3. 确认应答机制 4. 流量控制 5. 拥塞控制 6. 重传机制 结论 引言 TCP&#xff08;Transmission Control Protocol&#xff09;是计算机网络中的一个重要协议&#xff0c;它以其可靠性而闻名。TCP是一种面向连接的协议&…

影响晶振频率稳定性的因素及解决方法

晶振作为电子设备中的核心元件&#xff0c;其频率稳定性对设备的性能和可靠性具有重要影响。晶发电子将介绍影响晶振频率稳定性的因素&#xff0c;并探讨相应的解决方法。 一、影响晶振频率稳定性的因素 频率&#xff1a;晶振的频率是影响其性能的最重要因素之一。在选择晶振…

MongoDB介绍

一、MongoDB介绍 1.1 mongoDB介绍 MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB …

Jetpack DataStore

文章目录 Jetpack DataStore概述DataStore 对比 SP添加依赖库Preferences DataStore路径创建 Preferences DataStore获取数据保存数据修改数据删除数据清除全部数据 Proto DataStore配置AndroidStudio安装插件配置proto文件创建序列化器 创建 Proto DataStore获取数据保存数据修…

Spring AOP入门指南:轻松掌握面向切面编程的基础知识

面向切面编程 1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给…