《用 Python 学微积分》笔记 1
《用 Python 学微积分》原文见参考资料 1。
1、多项式
f(x)=x3-5x2+9
def f(x):
return x**3 - 5*x**2 + 9 print f(3)
print f(1) import numpy as np
x = np.linspace(-5, 5, num = 100)
y = f(x)
import matplotlib.pyplot as plt
plt.plot(x,y)
plt.show()
2、指数函数
exp(x)=ex
import numpy as np
import matplotlib.pyplot as plt def exp(x):
return np.e**x print exp(2) print np.exp(2) x = np.linspace(-5, 5, num = 100)
y = exp(x) plt.plot(x,y)
plt.show()
3、对数函数
import numpy as np
import matplotlib.pyplot as plt x = np.linspace(0.1,10,99,endpoint = False)
y1 = np.log2(x)
y2 = np.log(x)
y3 = np.log10(x)
plt.plot(x,y1,'red',x,y2,'yellow',x,y3,'blue')
plt.show()
4、三角函数
sin(x)
import numpy as np
import matplotlib.pyplot as plt plt.plot(np.linspace(-2*np.pi,2*np.pi),np.sin(np.linspace(-2*np.pi,2*np.pi)))
plt.show()
5、函数的复合
h(x)=x2+1
import numpy as np
import matplotlib.pyplot as plt def f(x): return x+1 def g(x): return x**2 def h(x): return f(g(x)) x = np.array(range(-10,10)) y = np.array([h(i) for i in x])
plt.plot(x, y, 'bo') # h2 = lambda x: f(g(x))
# plt.plot(x,h2(x),'rs')
plt.show()
6、逆函数
w=x2
winv(x)=x1/2
import numpy as np
import matplotlib.pyplot as plt w = lambda x: x**2
winv = lambda x: np.sqrt(x)
x = np.linspace(0,2,100) plt.plot(x, w(x),'b',x,winv(x),'r',x,x,'g-.')
plt.show()
7、高阶函数
x2 和 (x-2)2
import numpy as np
import matplotlib.pyplot as plt def g(x): return x**2 def horizontal_shift(f,H): return lambda x: f(x-H) x = np.linspace(-10,10,100)
shifted_g = horizontal_shift(g,2) plt.plot(x,g(x),'b',x,shifted_g(x),'r')
plt.show()
8、欧拉公式
指数函数的多项式:
$$e^x =1+\frac{x}{1!}+\frac{x^2}{2!}+\dots = \sum_{k = 0}^{\infty}\frac{x^k}{k!}$$
三角函数:
$$sin(x) = \frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\dots = \sum_{k = 0}^{\infty}{(-1)}^k\frac{x^{(2k+1)}}{(2k+1)!}$$
$$cos(x) = \frac{x^0}{0!}-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\dots = \sum_{k = 0}^{\infty}{(-1)}^k\frac{x^{2k}}{(2k)!}$$
虚函数的基本运算规则:
$$i^0=1,\quad i^1=i,\quad i^2=-1,\quad i^3=-i$$
$$i^4=1,\quad i^5=i,\quad i^6=-1,\quad i^7=-i$$
将 ix 代入指数函数的公式中:
$$e^{ix}=\frac{(ix)^0}{0!}+\frac{(ix)^1}{1!}+\frac{(ix)^2}{2!}+\frac{(ix)^3}{3!}+\frac{(ix)^4}{4!}+\frac{(ix)^5}{5!}+\frac{(ix)^6}{6!}+\frac{(ix)^7}{7!}+\dots$$
$$\qquad =\frac{i^0x^0}{0!}+\frac{i^1x^1}{1!}+\frac{i^2x^2}{2!}+\frac{i^3x^3}{3!}+\frac{i^4x^4}{4!}+\frac{i^5x^5}{5!}+\frac{i^6x^6}{6!}+\frac{i^7x^7}{7!}+\dots$$
$$\qquad = 1\frac{x^0}{0!}+i\frac{x^1}{1!}-1\frac{x^2}{2!}-i\frac{x^3}{3!}+1\frac{x^4}{4!}+i\frac{x^5}{5!}-1\frac{x^6}{6!}-i\frac{x^7}{7!}+\dots$$
$$\qquad = (\frac{x^0}{0!}-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\dots)+i(\frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\dots)$$
$$\qquad = cos(x)+isin(x)$$
此时便得欧拉公式:
$$e^{ix} = cos(x)+isin(x)$$
令 x=π,得:
$$e^{i\pi}+1=0$$
import numpy as np
import sympy
import matplotlib.pyplot as plt x = np.linspace(-np.pi,np.pi)
lhs = np.e**(1j*x)
rhs = np.cos(x)+1j*np.sin(x)
print sum(lhs==rhs)==len(x) z = sympy.Symbol('z', real = True)
sympy.expand(sympy.E**(sympy.I*z), complex = True) for p in np.e**(1j*x):
plt.polar([0, np.angle(p)],[0, abs(p)], marker = 'o')
plt.show()
9、泰勒级数
函数 f(x) 在 x=0 处展开的泰勒级数的定义为:
$$f(x)=f(0)+\frac{f'(0)}{1!}x+\frac{f''(0)}{2!}x^2+\frac{f'''(0)}{3!}x^3+\dots=\sum_{k=0}^{\infty}\frac{f^{(k)}(0)}{k!}x^k$$
ex,sin(x) 和 cos(x) 的多项式形式,都是它们自己在 x=0 处展开的泰勒级数。其中 ex 在 x=0 的展开为:
$$exp(x)=exp(0)+\frac{exp'(0)}{1!}x+\frac{exp''(0)}{2!}x^2+\frac{exp'''(0)}{3!}x^3+\dots$$
$$\qquad =1 + \frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+\dots$$
$$\qquad =\sum_{k=0}^{\infty}\frac{x^k}{k!}$$
泰勒级数可以把非常复杂的函数转变成无限项的和的形式。通常,我们可以只计算泰勒级数的前几项之和,便能够获得原函数的局部近似了。在做这样的多项式近似时,我们所计算的项越多,则近似的结果越精确。
下图是 e 在 x=0 处展开的泰勒级数分别取前 5、10 和 15 项时的值跟真实值的对比,可以看出,所计算的项越多,则近似的结果越精确。
import numpy as np
import sympy
import matplotlib.pyplot as plt x = sympy.Symbol('x')
exp = np.e**x def polyApprox(func,num_terms):
# 当我们需要反复做类似的步骤的时候,最好将步骤定义为一个函数
sums = 0
for i in range(num_terms):
numerator = func.diff(x,i)
numerator = numerator.evalf(subs={x:0})
denominator = np.math.factorial(i)
sums += numerator/denominator*x**i
return sums sum5 = polyApprox(exp,5)
sum10 = polyApprox(exp,10)
sum15 = exp.series(x,0,15).removeO() xvals = np.linspace(5,10,100)
for xval in xvals:
plt.plot(xval,exp.evalf(subs={x:xval}),'bo',\
xval,sum5.evalf(subs={x:xval}),'ro',\
xval,sum10.evalf(subs={x:xval}),'go',\
xval,sum15.evalf(subs={x:xval}),'yo') plt.show()
10、极限
定义:若要称函数 f(x) 在 x=a 处的极限为 L,即:
$$\lim_{x\rightarrow a}f(x)=L$$
则需要:对任意一个 ε>0,都能找到 δ>0,使得当 x 的取值满足 0<|x-a|<δ 时,|f(x)-L|<ε。
import numpy as np
import sympy
import matplotlib.pyplot as plt f = lambda x: x**2-2*x-6
x = np.linspace(0,5,100)
y = f(x) plt.plot(x,y,'red')
plt.grid('off') l = plt.axhline(-8,0,1,linewidth = 2, color = 'black')
l = plt.axvline(0,0,1,linewidth = 2, color = 'black') l = plt.axhline(y=2,xmin=0,xmax=0.8,linestyle="--")
l = plt.axvline(x=4,ymin=0,ymax=float(5)/9, linestyle = "--") l = plt.axhline(-6,3.7/5,4.3/5,linewidth = 2, color = 'black')
l = plt.axvline(1,6.0/18,14.0/18,linewidth = 2, color = 'black') p = plt.axhspan(-2,6,0,(1+np.sqrt(13))/5,alpha = 0.15, ec = 'none')
p = plt.axvspan((1+np.sqrt(5)),(1+np.sqrt(13)),0,1.0/3,alpha = 0.15, ec = 'none') p = plt.axhspan(f(3.7),f(4.3),0,4.3/5,alpha = 0.3, ec = 'none')
p = plt.axvspan(3.7,4.3,0,(f(3.7)+8)/18,alpha = 0.3, ec = 'none') plt.axis([0,5,-8,10]) plt.text(0.8,-1,r"$\epsilon$", fontsize = 18)
plt.text(0.8,4,r"$\epsilon$", fontsize = 18)
plt.text(3.75,-7.0,r"$\delta$", fontsize = 18)
plt.text(4.1,-7.0,r"$\delta$", fontsize = 18)
plt.text(3.95,-7.8,r"$a$", fontsize = 18)
plt.text(4.5,8.5,r"$f(x)$", fontsize = 18,color="red") plt.show()
现在用上面的定义来证明:
$$\lim_{x\rightarrow 4}x^2-2x-6=2$$
即对于任意的 ε>0,能找到一个 δ>0,使得 0<|x-4|<δ 时,有 |f(x)-2|<ε。
证明:注意到 |f(x)-2|=|x2-2x-6-2|=|(x-4)(x+2)|=|x-4|·|x+2|,已知 |x-4|<δ,根据三角形不等式,|x+2|=|x-4+6|≤|x-4|+6<δ+6,所以
|f(x)-2|=|x-4|·|x+2|<δ·(δ+6),现在只需找到一个 δ,满足 δ·(δ+6)<ε 即可,用二元一次方程知识就可以证明这样的 δ>0 是存在的。
或者只要令 δ=min(1,ε/7),即可使得 δ≤ε/7 且 δ+6≤7,使得 δ·(δ+6)<ε。
11、泰勒级数用于极限计算
我们在中学课本中一定记忆了常见的极限,以及极限计算的规则,这里我们便不再赘言。泰勒级数也可以用于计算一些形式比较复杂的函数的极限。这里,仅举一例:
$$\lim_{x\rightarrow 0}\frac{sin(x)}{x}=\lim_{x\rightarrow 0}{\frac{\frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\dots}{x}}$$
$$\qquad = \lim_{x\rightarrow 0}{\frac{x(1-\frac{x^2}{3!}+\frac{x^4}{5!}-\frac{x^6}{7!}+\dots)}{x}}$$
$$\qquad = \lim_{x\rightarrow 0}{1-\frac{x^2}{3!}+\frac{x^4}{5!}-\frac{x^6}{7!}+\dots}$$
$$\qquad = 1$$
12、洛必达法则
利用泰勒级数来计算极限,有时也会陷入困境,例如:求极限的位置是在我们不知道泰勒展开的位置,或者所求极限是无穷的。通常遇到这些情况我们会使用各种形式的洛必达法则。
这里我们仅尝试说明
$$\frac{0}{0}$$
形式的洛必达法则为何成立。
如果 f 和 g 是连续函数,且
$$\lim_{x\rightarrow a}f(x)=0,\quad \lim_{x\rightarrow a}g(x)=0$$
若
$$\lim_{x\rightarrow a}\frac{f'(x)}{g'(x)}$$
存在,则:
$$\lim_{x\rightarrow a}\frac{f(x)}{g(x)}=\lim_{x\rightarrow a}\frac{f'(x)}{g'(x)}$$
如果分子分母求导后仍然是 0/0 形式,那么重复该过程,直至问题解决。
运用泰勒级数,我们很容易可以理解洛必达法则为什么会成立:
$$\lim_{x\rightarrow a}{\frac{f(x)}{g(x)}}=\lim_{x\rightarrow a}{\frac{f(a)+\frac{f'(a)}{1!}(x-a)+\frac{f''(a)}{2!}(x-a)^2+\frac{f'''(a)}{3!}(x-a)^3+\dots}{g(a)+\frac{g'(a)}{1!}(x-a)+\frac{g''(a)}{2!}(x-a)^2+\frac{g'''(a)}{3!}(x-a)^3+\dots}}$$
$$\qquad = \lim_{x\rightarrow a}{\frac{\frac{f'(a)}{1!}(x-a)+\frac{f''(a)}{2!}(x-a)^2+\frac{f'''(a)}{3!}(x-a)^3+\dots}{\frac{g'(a)}{1!}(x-a)+\frac{g''(a)}{2!}(x-a)^2+\frac{g'''(a)}{3!}(x-a)^3+\dots}}$$
$$\qquad =\lim_{x\rightarrow a}{\frac{f'(a)+\frac{f''(a)}{2!}(x-a)+\frac{f'''(a)}{3!}(x-a)^2+\dots}{g'(a)+\frac{g''(a)}{2!}(x-a)+\frac{g'''(a)}{3!}(x-a)^2+\dots}}$$
$$\qquad = \lim_{x\rightarrow a}\frac{f'(x)}{g'(x)}$$
参考资料:
[1] https://ryancheunggit.gitbooks.io/calculus-with-python/content/
《用 Python 学微积分》笔记 1的更多相关文章
- Ruby零碎笔记
Ruby零碎笔记 飞机上阅读pdf的笔记,因为不联网,内容不多而且比较零散,以tips的形式记录 tips 查看当前作用域的变量 puts local_variables ruby中方法传递参数时,括 ...
- Ruby学习笔记4: 动态web app的建立
Ruby学习笔记4: 动态web app的建立 We will first build the Categories page. This page contains topics like Art, ...
- ruby学习笔记(1)-puts,p,print的区别
ruby学习笔记-puts,p,print的区别 共同点:都是用来屏幕输出的. 不同点:puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将 ...
- Ruby入门笔记
Ruby入门笔记 一切皆为对象 “Hello”.length 方法 定义:def开头 end结尾 命名一般采用下划线分隔单词
- ruby编程语言-学习笔记5(第5章 语句和控制结构)
以下是2种表达方式一样. if expression code end if expression then #推荐这种形式 code end expression的值不是false或nil,则cod ...
- ruby编程语言-学习笔记4(第4章 表达式和操作符)
4.6.9 范围 Flip-Flops: ..和... ..和... 操作符不是基于方法的,无法重定义.(优先级比较低) x+1 .. x*x #可以认为是x+1 至 x*x 的范围 因为操作 ...
- ruby编程语言-学习笔记2(第4章 表达式和操作符)
对属性和数组元素的赋值 o.m + = 1 ===>o.m = (o.m()+ 1) # 对 o.m()这个方法的结果+1 对数组元素的赋值也是通过 方法调用来完成. 0.[] = 1 == ...
- ruby编程语言-学习笔记1
安装完 ruby ri irb ruby-devel 1. 先来个简单的,写个helloworld 给新手们 (terminal中,# 代表root权限,$ 代表用户权限, 前面的就不写了.) # ...
- 《ruby编程语言》笔记2 对象
ruby是一门非常纯粹的面向对象的语言:所有值都是对象,而且没有基本类型(primitive type)和对象类型的区别,这一点不同于其他语言.在Ruby中,所有对象都继承一个Object类,而且共享 ...
- 《ruby编程语言》笔记 1
赋值: ruby支持并行赋值,即允许在赋值表达式中出现多余一个值和多于一个的变量: x,y=1,2a,b=b,ax,y,z=[1,2,3] (python同样可以正常上面的语句). Methods i ...
随机推荐
- PCI 设备详解一
2016-10-09 其实之前是简单学习过PCI设备的相关知识,但是总感觉 自己的理解很函数,很多东西说不清楚,正好今天接着写这篇文章自己重新梳理一下,文章想要分为三部分,首先介绍PCI设备硬件相关的 ...
- js 屏蔽浏览器右键菜单
<script type="text/javascript"> function doNothing(){ window.event.returnValue=false ...
- angular-file-upload
<div id="page-title"> <h2 class="title-hero" ng-if="!isEdit"& ...
- mysql数据库从删库到跑路之mysql完整性约束
一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...
- 无线路由和无线AP的区别
一.答疑解惑 1.什么是无线AP? AP:Access Point 接入点 无线AP:无线接入点是一个无线网络的接入点,俗称“热点”.主要有路由交换接入一体设备和纯接入点设备,一体设备执行接入和路由工 ...
- ACM-ICPC 2018 焦作赛区网络预赛 F. Modular Production Line (区间K覆盖-最小费用流)
很明显的区间K覆盖模型,用费用流求解.只是这题N可达1e5,需要将点离散化. 建模方式步骤: 1.对权值为w的区间[u,v],加边id(u)->id(v+1),容量为1,费用为-w; 2.对所有 ...
- (译)Windows Azure:移动后端开发的主要更新
Windows Azure:移动后端开发的主要更新 这周我们给Windows Azure释出了一些很棒的更新,让云上的移动应用开发明显的简单了.这 些新功能包括: 移动服务:定制API支持移动服务:G ...
- laravel request 增加字段
https://segmentfault.com/q/1010000006898668 $input = $request->only(['username', 'password']); // ...
- Wex5各组件介绍
1.http://doc.wex5.com/comp-base/ 2.select 组件 http://doc.wex5.com/comps-select/ 3.页面交互以及传递参数 http:// ...
- HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查
转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...