在学期开始时,我建议您使用Anaconda Navigator赢博体育程序来设置一个环境,以便在本课程中使用。在接下来的几周里,我将向您介绍一些Python包:在许多情况下,我们需要从向您的环境中添加一些额外的包开始。
在今天的讲座中,我们将使用matplotlib,这是一个用于构建绘图的软件包。要使用matplotlib,需要将其添加到环境中。
启动Anaconda Navigator赢博体育程序,并单击主屏幕左侧的environments选项卡。从可用环境列表中选择CMSC210环境。在右侧窗格中,从菜单中选择Not Installed,然后在搜索框中输入matplotlib。
在结果列表中单击matplotlib旁边的复选框,然后单击apply。
接下来,为了能够在Visual Studio Code中显示图形,您需要安装第二个包。按照上面概述的过程安装jupyter包。
引入pyplot
matplotlib库中的一个模块是pyplot,它为构造图形提供了一个简单易用的接口。
对于我们的第一个pyplot示例,我将以我们之前讲座中的一个线性回归示例为基础。这一次,我想计算回归线,然后使用pyplot来绘制原始数据点和回归线。
下面是该示例的完整源代码。下面我将对此进行详细分析,并介绍使用pyplot的一些特定方面。
进口matplotlib。pyplot as plt def cleanLine(line): ““”将原始行列表转换为适当的数据格式。”“” return (int(line[0]), float(line[1])) def readData(fileName): "“”通用数据读取函数。使用cleanLine对数据行进行格式化。”“data =[]张开(文件名)f:线在f.readlines (): data.append (cleanLine (line.split()))返回数据def意味着(双):xSum = 0 ySum x = 0, y成对:xSum + y = x ySum + = N = len(对)返回(xSum / N, ySum / N) def协方差(对,意味着):金额为x = 0, y成对:总和+ = (x [0]) * (y表示[1])返回总和def xVariance(对,xMean):金额为x = 0, y成对:总和+ = (x-xMean) * (x-xMean)返回总和def regressionCoeffs(双):从(x,y)对的列表中计算线性回归系数(a,b)。“” m = means(pairs) beta = covariance(pairs,m)/xVariance(pairs,m[0]) alpha = m[1]-beta*m[0] return (alpha,beta) rawData = readData("farm.txt") pairs = [cleanLine(line) for line in rawData] a,b = regressionCoeffs(pairs) # pyplot期望绘制的数据是x值列表和y值列表的#形式。#重新配置数据以适应pyplot。x = [year for year,pop in rawData] y = [pop for year,pop in rawData] s = [1930,1990] t = [a+b*1930,a+b*1990] #现在绘制数据序列和回归线plt.plot(x,y,'rs',s,t,'b-') #设置轴细节plt.axis([1930,1990,0,35]) #添加标题和标签plt。title(“回归示例”)plt.xlabel(“年份”)ylabel(“农场人口(百万)”)
要在Visual Studio Code中运行此程序,请右键单击文件视图中的文件,并选择“在新交互窗口中运行文件”选项。
要使用pyplot,我们从import语句开始。
进口matplotlib。Pyplot为PLT
matplotlib是Anaconda发行版的一部分,所以您应该已经安装了matplotlib。
重要提示:Mac用户可能需要将此import语句替换为如下所示的替代语句:
import matplotlib.use('TkAgg')Pyplot为PLT
pyplot中第一个也是最重要的方法是plot()方法,它绘制一组数据点。Plot()期望以x值列表和单独的y值列表的形式提供数据点。如果您的数据没有以这种方式组织,您将不得不编写一些代码来重新组织它。在这个例子中,我们从文件中读取的数据被存储为(x,y)元组的列表,所以我们必须开始用一些代码从该数据构建单独的x和y列表:
x =[年为一年,弹出rawData] y =[年为一年,弹出rawData]
为了绘制回归线,我们简单地构建了一个由几个点组成的数据序列,这些点是我们要绘制的直线的端点:
S = [1930,1990] t = [a+b*1930,a+b*1990]
plot()命令可以绘制一个或多个数据序列。在每个序列之后,我们还需要提供一个格式字符串来指定我们希望如何绘制该序列:
“rs”plt.plot (x, y,, t, b -)
格式字符串由两个字符组成,一个颜色和一个情节样式。下面是可用的颜色值及其字母代码的表格:
颜色 | 代码 |
---|---|
蓝色的 | b |
绿色 | g |
红色的 | r |
青色 | c |
洋红色 | 米 |
黄色的 | y |
黑色的 | k |
白色 | w |
下面是一些可用的情节风格的表格:
风格 | 代码 |
---|---|
行 | - |
虚线 | : |
点 | . |
圆 | o |
广场 | 年代 |
我们上面使用的绘图示例将使用红色方块和回归线作为蓝线来绘制数据序列。
在设置好绘图之后,你通常还需要设置坐标轴并标记它们。这些命令就是这样做的。
plt.axis([1930,1990,0,35]) plt.xlabel("Year")ylabel(“农场人口(百万)”)
axis()方法接受一个列表,该列表给出x轴的开始值和结束值,然后是y轴的开始值和结束值。
绘图的最后一步是告诉pyplot显示该绘图。
plt.show ()
这将打开一个显示绘图的图形窗口。图形窗口提供了允许您编辑或保存图像的控件。下面是这个示例程序生成的图。
你也可以让pyplot将图保存在一个图像文件中:
plt.savefig('farm.png')
这将把图像文件保存在与Python程序源代码文件相同的目录中。
在下一个例子中,我们将绘制逻辑函数的平滑曲线
这是pyplot将为我们生成的图。
下面是生成这个图的程序代码。
进口matplotlib。pyplot as plt import math def (x):返回1/(1+math.exp(-x)) xs = [-5 + 0.1*i for i in range(0,101)] ys = [f(x) for x in xs] #现在将此数据绘制为平滑曲线plt。plot(x, y, 'b-') #设置坐标轴细节plt.axis([-5,5,0,1]) #添加标题和标签plt。title("Logistic Function") plt.xlabel("x") plt.ylabel("f(x)") plt.savefig(" smooth.png ")
这里的基本方法与上一个示例相同。我们首先沿着x轴制作一个样本列表。然后构造第二个列表,其中包含通过将x个样本中的每个样本传递给函数f(x)而得到的y个值。然后,我们用‘b-’格式字符串将这两个列表传递给pyplot plot()函数,该函数将样本点连接在一起,形成大量的蓝色线段。由于每个线段都很短,所以把它们放在一起的效果是创造出一条光滑的曲线。
为了便于制作x个样本并对其进行评估,我们使用了一对列表综合。
关于pyplot和matplotlib的更多信息
我上面展示的两个例子充分展示了pyplot可以做什么,以满足课程其余部分的绘图需求。Pyplot和matplotlib能够做更多的事情,并为构建各种不同的绘图提供了工具。如果您感到好奇,我邀请您访问matplotlib官方网站:matplotlib.org。
一阶常微分方程是这样的方程
除了初始条件
X (0) = x0
解这个方程要求我们找到x(t)的表达式同时满足方程和初始条件。不是赢博体育的微分方程都能精确地解;然而,有许多相对简单和直接的方法来求解的数值近似值。在本作业中,我们将研究三种这样的方法。
当我们精确地解微分方程时,我们试图确定满足方程和初始条件的函数x(t)如果我们能够找到x(t)我们当然能够在时间t的任意点对这个解函数求值。下面我们将要看到的方法都是试图在孤立的时间点上构造x(t)的近似值的方法。具体来说,我们将尝试估计孤立点集合ti = t0 + ih的x(ti),其中h是我们选择的某个步长。
让我们考虑一下如何找到第一个未知点,x(t1)
获得x(t1)的一种方法是从已知的点(t0, x0)开始,画一条斜率刚好的线,以达到x(t1)的正确值。
问题当然是我们不知道击中目标所需的准确斜率。我们将在下面学习的各种方法都是为了更好地近似正确的斜率。
第一种方法使用我们唯一可用的斜率作为正确斜率的开始猜测。因为我们知道t0和x0,我们可以把它们代入微分方程来计算t = t0时x(t)的斜率:
如果我们用这个作为斜率,沿着这条线到t = t1,我们会到达一个点
x1 = x (t0) + f (t0, x0) (t1 - t0) = x (t0) + f (t0, x0) h
这对x(t1)是一个很差的估计。下面的图片说明了这种情况。
从(t1, x1)我们可以简单地重复这个过程:
X2 = x1 + f(t1, x1) (t2 - t1) = x1 + f(t1, x1) h
更一般地说,这种方法通过这个过程使我们从一个估计点(tn, xn)到一个新的估计点(tn+1, xn+1)
Tn +1 = Tn + h
K1 = f(tn, xn)
Xn +1 = Xn + k1h
我想再次强调,这是一个糟糕的方法(如上图所示)。我们可以通过减小步长h来略微改进该方法。在t方向上的步长越小,估计点x1偏离解的实际值x(t1)的机会就越小。更重要的是,我们可以改进这个方法用一个更好的斜率代替我们在这个方法中使用的斜率k1它能更好地使我们更接近目标点。
修正欧拉法试图改进欧拉法,使用一对导数的平均值作为我们所寻求的神秘斜率的更好的近似值。修正欧拉法首先使用欧拉法计算近似x(tn+ 1)称为p1。堵塞tn+ 1近似的x代入微分方程提供了导数的近似值x(tn+ 1),称为k2。修正欧拉法取导数的平均值k1 = x
(tn),将其作为神秘斜率的近似值,然后计算出更好的估计值xn+ 1.
以下是相关公式。
Tn +1 = Tn + h
K1 = f(tn, xn)
P1 = xn + k1 h
K2 = f(tn+1, p1)
虽然欧拉法和修正欧拉法都很容易理解,但这两种方法都不能很好地近似问题的精确解。为了得到更好的结果,我们通常必须采用更复杂的方法。龙格-库塔法就是这样一种通常能产生很好的结果的方法。与Euler方法和Modified Euler方法一样,该方法使用先前计算的点xn结合来自f(t,x(t))函数的信息来计算后续点xn+1。为了做到这一点,龙格-库塔使用了一套更复杂的公式,如下所示:
Tn +1 = Tn + h
K1 = f(tn, xn)
K2 = f(tn + h/2, xn + k1 h/2)
K3 = f(tn + h/2, xn + k2 h/2)
K4 = f(tn + h, xn + k3 h)
这是我们在这次作业中要解决的一个具体问题:
编写一个程序,使用龙格-库塔方法构造一个近似解点序列(tn, xn),从(t0, x0) =(0,1 /2)开始,以t = 1.0结束。允许用户输入要执行的步数N。N步对应h = 1/N的值。使用h的值,让你的程序计算x的估计值列表。
最后,让您的程序生成一个估计点的图以及实际解的曲线。这个微分方程的实际解是