【第3章】微积分问题的计算机求解

极限问题的解析解

单变量函数的极限

假设已知函数f(x),则极限问题一般描述为

\[L=\lim_{x \to x_0} f(x) \]

此外,还有单边极限问题

\[L=\lim_{x \to x_0^-} f(x) \quad \text{左极限} \\ L=\lim_{x \to x_0^+} f(x) \quad \text{右极限} \]

matlab同样可以做这些极限运算

L=limit(fun,x,x0)    %求极限
L=limit(fun,x,x0,'left'或'right')    %求单边极限

举个例子

试求解极限问题

\[\lim_{x \to \infty} \frac{sin(x)}{x} \]

matlab代码

syms x; f=sin(x)/x; 
limit(f,x,0)

运行结果截图

【第3章】微积分问题的计算机求解

多变量函数的极限

若想求出二元函数的极限

\[L=\lim_{x \to x_0 \atop y \to y_0} f(x) \]

我们可以嵌套使用limit()函数。

L1=limit(limit(f,x,x0),y,y0) 或
L1=limit(limit(f,y,y0),x,x0)

如果x0或y0不是确定的值,而是另一个变量的函数,例如 $ x \to g(y) $ ,则上述极限求取顺序不能交换。

函数导数的解析解

函数的导数和高阶导数

如果函数fun和自变量x都已知,且均为符号变量,则可以用diff()函数解出给定函数的各阶导数。

y=diff(fun,x)    %求导
y=diff(fun,x,n)  %求n阶导

例:给出如下函数,试求出其一阶导数

\[f(x)= \frac{sinx}{x^2+4x+3} \]

matlab代码

syms x;
f=sin(x)/(x^2+4*x+3);
f1=diff(f,x,1);
latex(f1)

最后得出结果如下

\[\frac{\cos\!\left(x\right)}{x^2 + 4\, x + 3} - \frac{\sin\!\left(x\right)\, \left(2\, x + 4\right)}{{\left(x^2 + 4\, x + 3\right)}^2} \]

复合泛函求导

例:给出如下函数,试求出其三阶导数公式,以及 $f(t)= e^{-t} $ 时的结果 关键 将f(t)声明为符号变量

\[F(t) = t^2 sint f(t) \]

matlab代码

syms t f(t); 
G=simplify(diff(t^2*sin(t)*f,t,3))
simplify(subs(G,f,exp(-t))), 
simplify(diff(t^2*sin(t)*exp(-t),3)-ans)

最后得出结果如下

G(t)=
6*cos(t)*f(t) + 6*sin(t)*diff(f(t), t) + 3*t^2*cos(t)*diff(f(t), t, t) + 12*t*cos(t)*diff(f(t), t) - 6*t*f(t)*sin(t) + t^2*sin(t)*diff(f(t), t, t, t) - 3*t^2*sin(t)*diff(f(t), t) + 6*t*sin(t)*diff(f(t), t, t) - t^2*cos(t)*f(t)

ans(t) =
2*exp(-t)*(3*cos(t) - 3*sin(t) + t^2*cos(t) + t^2*sin(t) - 6*t*cos(t))

ans(t) =
0

矩阵函数的求导

矩阵的求导:

\[H(x)= \begin{bmatrix} 4sin(5x) & e^{-4x^2} \\ 3x^2+4x+1 & \sqrt{4x^2+2} \\ \end{bmatrix} \]

可以对每个元素分别求导

syms x; 
H=[4*sin(5*x), exp(-4*x^2); 3*x^2+4*x+1, sqrt(4*x^2+2)];
H1=diff(H,x,3)

运行结果:

H1 =
 
[ -500*cos(5*x),                               192*x*exp(-4*x^2) - 512*x^3*exp(-4*x^2)]
[             0, (24*2^(1/2)*x^3)/(2*x^2 + 1)^(5/2) - (12*2^(1/2)*x)/(2*x^2 + 1)^(3/2)]

参数方程的导数

matlab中没有直接能够求解参数方程的函数,但我们可以根据其在数学上的定义来求:

【第3章】微积分问题的计算机求解

根据递推公式,我们可以从中看出了,它的形式与我们之前学习的递归调用有很大的相似性,因此我们可以编写一个这样的函数paradiff(y,x,t,n)来求参数方程的n阶导数

%paradiff.m
function result=paradiff(y,x,t,n)
if mod(n,1)~=0, error('n should positive integer, please correct')
else, if n==1, result=diff(y,t)/diff(x,t);
   else, result=diff(paradiff(y,x,t,n-1),t)/diff(x,t);
end, end

例:已知参数方程如下,求其三阶导数

\[\begin{cases} y=\frac{sint}{(t+1)^3} \\ x=\frac{cost}{(t+1)^3} \end{cases} \]

matlab代码

syms t; 
y=sin(t)/(t+1)^3; 
x=cos(t)/(t+1)^3; 
f=paradiff(y,x,t,3); 
[n,d]=numden(f); %提取分子和分母,进行单独化简
F=simplify(n)/simplify(d)

运行结果

F =
(3*(t + 1)^7*(23*cos(t) + 24*sin(t) - 6*t^2*cos(t) - 4*t^3*cos(t) - t^4*cos(t) + 12*t^2*sin(t) + 4*t^3*sin(t) - 4*t*cos(t) + 32*t*sin(t)))/(3*cos(t) + sin(t) + t*sin(t))^5

多元函数的偏导数

matlab中没有求取偏导数的专门函数,但我们仍可以通过diff()函数直接实现。假设已知二元函数f(x,y),若想求

\[\frac{\partial ^{m+n}}{\partial x^m \partial y^n}f(x,y) \]

则可以使用下面的函数求出

f=diff(diff(f,x,m),y,n) %或者
f=diff(diff(f,y,n),x,m)

例:求如下函数的两个偏导数 $ \partial z / \partial x , \partial z / \partial y $

\[z=f(x,y)=(x^2-2x)e^{-x^2-y^2-xy} \]

matlab代码

syms x y; 
z=(x^2-2*x)*exp(-x^2-y^2-x*y); 
zx=simplify(diff(z,x)), 
zy=diff(z,y)

运行结果

zx =
exp(- x^2 - x*y - y^2)*(2*x + 2*x*y - x^2*y + 4*x^2 - 2*x^3 - 2)
 
zy =
exp(- x^2 - x*y - y^2)*(- x^2 + 2*x)*(x + 2*y)

利用得到的偏导数函数zx,zy我们可以在z这个三维曲面上绘制出引力线,得到其梯度函数图形表示,引力线物理意义可看作一个小球在这个位置所受的力。

[x0,y0]=meshgrid(-3:.2:2,-2:.2:2); 
z0=double(subs(z,{x,y},{x0,y0})); %将符号型转为double型
surf(x0,y0,z0), zlim([-0.7 1.5]) %先画出Z曲面
contour(x0,y0,z0,30), hold on; %画出等高线并保持
zx0=subs(zx,{x,y},{x0,y0}); 
zy0=subs(zy,{x,y},{x0,y0}); %计算出各个点偏导数的值
quiver(x0,y0,-zx0,-zy0) %把偏导数结果用引力线形式表示出来

最终图如下:

【第3章】微积分问题的计算机求解

隐函数的偏导数

还是直接上结论吧,matlab没有直接求隐函数的偏导数的函数,所以我们根据数学上的公式,编写函数impldiff(f,x,y,n)对 $ z=f(x,y) $ 求n阶偏导数

上代码:

%impldiff.m
function dy=impldiff(f,x,y,n)
if mod(n,1)~=0, error('n should positive integer, please correct')
else, F1=-simplify(diff(f,x)/diff(f,y)); dy=F1;
   for i=2:n, dy=simplify(diff(dy,x)+diff(dy,y)*F1); 
end, end   

例:求如下二元隐函数的一阶偏导数

\[z=f(x,y)=(x^2-2x)e^{-x^2-y^2-xy}=0 \]

matlab代码

syms x y; 
f=(x^2-2*x)*exp(-x^2-y^2-x*y); 
F1=impldiff(f,x,y,1)

运行结果:

F1 =
(2*x + 2*x*y - x^2*y + 4*x^2 - 2*x^3 - 2)/(x*(x + 2*y)*(x - 2))

多元函数的雅可比(Jacobian)矩阵

假设有n个自变量的m个函数定义为

\[\begin{cases} y_1=f_1(x_1,x_2,\cdots x_n) \\ y_2=f_2(x_1,x_2,\cdots x_n) \\ \qquad \quad \vdots \qquad \vdots \\ y_m=f_m(x_1,x_2,\cdots x_n) \end{cases} \]

将相应的 $ y_i $ 对 $ x_i $ 求偏导,则得出矩阵

\[J= \begin{bmatrix} \frac{\partial y_1 }{\partial x_1 } & \frac{\partial y_1 }{\partial x_2 } & \cdots & \frac{\partial y_1 }{\partial x_n } \\ \frac{\partial y_2 }{\partial x_2 } & \frac{\partial y_2 }{\partial x_2 } & \cdots & \frac{\partial y_2 }{\partial x_n } \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_m }{\partial x_1 } & \frac{\partial y_m }{\partial x_2 } & \cdots & \frac{\partial y_m }{\partial x_n } \end{bmatrix} \qquad \]

该矩阵又称为雅可比(Jacobian)矩阵,在matlab中可以用jacobian()函数直接求得。该函数的调用格式为jacobian(x,y),其中x是自变量构成的向量,y是由各个函数构成的向量。

上一篇:数据结构之栈


下一篇:四元数阅读文档笔记记录