phython拟合曲面方程_“绘图,让科学生动起来”:Python-matplotlib绘图(多元函数拟合-3D绘图专题)...

2b0456969efedc994b432e83bce05557.png

作者简介:85后一名分析化学工作者及科学爱好者,深爱着北京的老北京人,爱好运动,科学,旅行,个人微信公众号《科学是什么东东》,欢迎关注!

搭建python-matplotlib绘图平台的四个要素是什么:

它们是:python软件主体;pip库管理工具;matplotlib绘图库;文本编辑器。

在这一专题中,我们将介绍多元函数的3D图形化和拟合。在理学和工学工作中,或在数学教学中,人们总会遇到多种多样的函数,其中以X,Y,Z为自(因)变量的多元函数占很大一部分,如何让函数图形化呢?我们运用matplotlib就可以实现,以下是几种多元函数的3D图形化:

Z=X^2-Y^2

00f373a167cf07894331331f5196d488.gif

Z=(X-Y)^2

8c8271d97e3f9100bc6c21a0382f8c4b.gif

在分析化学中,经常会遇到多元组分对总浓度值的影响,我们可利用matplotlib将其图形化,从而分析多元组分浓度分布Z=0.5X^2+2Y-1.5(示例)

8b214807909e3c095361d173998c76b4.gif

Z=sin(sqrt(X^2+Y^2))

660fd93fe997a05c45148936824abbff.gif

在数学教学中,使用matplotlib库,即可以让孩子直观认识抛物线Z=X^2,也可以学习编程,一举两得

9cfcbf1fea2ae5220215ade423d42280.gif

我们需要着手设计程序,可实现的功能为:

允许用户输入x,y轴长度值,x和y的次方数(整数),x,y,z轴和主标题的标签名称(英文)。

最终效果:生成3D视图,并分别在xy,xz,yz的平面上生成等高线图。

在图形显示窗口,我们可以通过鼠标操作改变视角,缩放图形,也可保存视图。

主程序代码如下:

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()

ax=Axes3D(fig)

print("Welcometo use 3D graphic generator, the formula model is z=sqrt(x^n1+y^n2).n")

a1=input("pleaseenter x axis length value(x),actual display range is from - x to x:n")

a1=float(a1)

print("Thex axis actual display range is from - "+str(a1)+" to"+str(a1)+":n")

a2=input("pleaseenter y axis length value(y),actual display range is from - y to y:n")

a2=float(a2)

print("They axis actual display range is from - "+str(a2)+" to"+str(a2)+":n")

a3=input("pleaseenter n power number of x value:(please enter an integer)n")

a3=int(a3)

print("The power number of x value is "+str(a3)+".n")

a4=input("pleaseenter n power number of y value:(please enter an integer)n")

a4=int(a4)

print("Thepower number of y value is "+str(a4)+".n")

X=np.arange(-a1,a1,0.5)

Y=np.arange(-a2,a2,0.5)

X,Y=np.meshgrid(X,Y)

Z=np.sqrt(X**a3+Y**a4)

ax.plot_surface(X,Y,Z,rstride=2,cstride=2,alpha=0.5,cmap=plt.cm.rainbow)

x1=input("pleaseenter x label name:n")

x2=input("pleaseenter y label name:n")

x3=input("pleaseenter z label name:n")

x4=input("pleaseenter title label name:n")

ax.set_xlabel(x1,fontsize=20)

ax.set_ylabel(x2,fontsize=20)

ax.set_zlabel(x3,fontsize=20)

ax.set_title(x4,fontsize=25)

ax.view_init(30,35)

b1=a1+4

b2=a2+4

cset=ax.contour(X,Y, Z, zdir = 'x', offset = -b1, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = 'y', offset = -b2, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = 'z', offset = -7, cmap = plt.cm.hot)

ax.set_xlim(-b1,b1)

ax.set_ylim(-b2,b2)

ax.set_zlim(-8,8)

plt.show()

该程序主要步骤解析为:

1. 分别导入3个库,以实现基本函数,matplotlib绘图以及3D做图功能:(进行三维绘图时,最后一个库的导入必不可少,若进行二维绘图,只导入前两个库即可)

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

2.通过输入设定x,y的坐标范围,并生成网格,如下:

其中a1,a2分别代表X,Y坐标的选值范围,0.5代表单个网格的跨度,越小,曲面越平滑

X=np.arange(-a1,a1,0.5)

Y=np.arange(-a2,a2,0.5)

X,Y=np.meshgrid(X,Y)

3.构建Z关于X和Y的方程,示例如下(可做很多变换):

Z=np.sqrt(X**a3+Y**a4)

又例如:

#注释:X的多次方和Y的多次方之和开根号的正弦值

R=np.sqrt(X**a3+Y**a4)

Z=np.sin(R)

#注释:X的多次方和Y的多次方之差开根号的余弦值

R=np.sqrt(X**a3-Y**a4)

Z=np.cos(R)

#注释:以e为底的(X的多次方和Y的多次方之差开根号)次方

R=np.sqrt(X**a3-Y**a4)

Z=np.exp(R)

注:a3,a4可在程序中进行输入

#注释:X平方与Y平方之和

Z=X^2+Y^2

#注释:多元组分

多元组分浓度分布Z=0.5X^2+2Y-1.5

4.创建关于x,y,z的3D视图,x,y轴步长均为2,透明度为0.5,彩虹色渐变,如下:

ax.plot_surface(X,Y,Z,rstride=2,cstride=2,alpha=0.5,cmap=plt.cm.rainbow)

5.创建该3D视图在xy,xz,yz平面的投影图,并选择投影的坐标面位置,hot色渐变,如下:

cset=ax.contour(X, Y, Z, zdir = 'x', offset = -b1, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = 'y', offset = -b2, cmap = plt.cm.hot)

cset=ax.contour(X,Y, Z, zdir = 'z', offset = -7, cmap = plt.cm.hot)

6.设定xyz轴的显示范围,如下:

ax.set_xlim(-b1,b1)

ax.set_ylim(-b2,b2)

ax.set_zlim(-8,8)

7.最终生成画图:

plt.show()

当然,对于函数主体,我们也可以加入重复绘图的命令:

在导入各种库的命令之后,加入(这里不需要首行缩进)

while True:

结尾处加入(注意全部需要首行缩进,break在if语句后进行首行缩进)

keep_testing=input("continuepainting?")

if keep_testing=='n':

break

中间的全部命令也要首行缩进

这样就可以在图形关闭后,系统会自动提示是否再次画图,按n后结束程序

讲到这里,本期的内容就告一段落了,脚本编辑是开放式设计,可以进行很多改造,让程序段更完善。

本文作者的个人微信公众号《科学是什么东东》,欢迎关注!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值