主题:如何从隐函数中求高阶导数呢?
yzq612
[专家分:0] 发布于 2008-01-10 10:56:00
例如,log(x)+exp(-y./x)=0,需要求y对x的二阶导数,如何用matlab实现呢?
回复列表 (共7个回复)
沙发
Guassfans [专家分:4090] 发布于 2008-01-12 12:14:00
一.视y为 x的函数,两边对x 求导:
1/x + exp(-y/x)(y/x^2-y'/x)=0 ....(1)
==>y'=....
-1/x^2 + exp(-y/x)(y/x^2-y'/x)^2+exp(-y/x)(y'/x^2-2y/x^3-y''/x+y'/x^2))
(对(1)式两边对x 求导,并将y'代入)
==>y''=....
二.f(x,y)=log(x)+exp(-y./x)
dy/dx=-fx/fy
In Matlab :
>> syms x y
>> f=log(x)+exp(-y/x)
>> dy=-diff(f,x)/diff(f,y)
dy =
-(-1/x-y/x^2*exp(-y/x))*x/exp(-y/x)
>> g=1/x + exp(-y/x)*(y/x^2-dy/x) %此即上述(1)式y' 代之于dy
>> ddy=-diff(g,x)/diff(g,y)
ddy =
(1/x^2-y/x^2*exp(-y/x)*(y/x^2+(-1/x-y/x^2*exp(-y/x))/exp(-y/x))-exp(-y/x)*(-2*y/x^3+(1/x^2+2*y/x^3*exp(-y/x)-y^2/x^4*exp(-y/x))/exp(-y/x)-(-1/x-y/x^2*exp(-y/x))/exp(-y/x)*y/x^2))/(-1/x*exp(-y/x)*(y/x^2+(-1/x-y/x^2*exp(-y/x))/exp(-y/x))+exp(-y/x)*(1/x^2+(-1/x^2*exp(-y/x)+y/x^3*exp(-y/x))/exp(-y/x)+(-1/x-y/x^2*exp(-y/x))/exp(-y/x)/x))
由于平日未涉及此类问题,故在此只能给出一种基于数学分析有关原理的解法,希望有朋友给出更简便的方法!
板凳
yzq612 [专家分:0] 发布于 2008-01-14 10:37:00
谢谢您的回复!
您的算法我基本能看懂。由于我刚学matlab不久,有些细节问题我还不是很明白。您能将所有程序语句都贴上来吗?谢谢!
其中,我有个小问题,
>> g=1/x + exp(-y/x)*(y/x^2-dy/x)
您是如何得到的?是手工算出来的还是编程算出的呢?如果f(x,y)很复杂,手工几乎无法算的话,如何编程得到g呢?
谢谢!
3 楼
blivfate [专家分:720] 发布于 2008-01-14 17:55:00
其中的g是由语句dy=-diff(f,x)/diff(f,y)
然后经过简单的化简就会得到,其实是一个隐函数求导的问题,你可以对dy再次求导,就能够得到y对x的二阶导数了
完整的程序如下:
>> syms x y
>> f=log(x)+exp(-y/x)
f =
log(x)+exp(-y/x)
>> dy=-diff(f,x)/diff(f,y)
dy =
-(-1/x-y/x^2*exp(-y/x))*x/exp(-y/x)
>> simple(dy)
simplify:
(x+y*exp(-y/x))/x*exp(y/x)
radsimp:
(x+y*exp(-y/x))/x/exp(-y/x)
combine(trig):
(x+y*exp(-y/x))/x/exp(-y/x)
factor:
(x+y*exp(-y/x))/x/exp(-y/x)
expand:
exp(y/x)+y/x
combine:
(1/x+y/x^2*exp(-y/x))*x*exp(y/x)
convert(exp):
-(-1/x-y/x^2*exp(-y/x))*x/exp(-y/x)
convert(sincos):
-(-1/x-y/x^2*exp(-y/x))*x/exp(-y/x)
convert(tan):
-(-1/x-y/x^2*exp(-y/x))*x/exp(-y/x)
collect(x):
1/exp(-y/x)+y/x
mwcos2sin:
-(-1/x-y/x^2*exp(-y/x))*x/exp(-y/x)
ans =
exp(y/x)+y/x
>> d2y=simple(-diff(dy,x)/diff(dy,y))
d2y =
y/x
4 楼
Guassfans [专家分:4090] 发布于 2008-01-14 22:48:00
f(x,y)=0
==>fx+fy*y'=0
y'=-fx/fy (fy<>0)
==>fxx+fxy*y'+[fyx+fyy*y']*y'+fy*y''=0
==>y''=[2*fx*fy*fxy-fy^2*fxx-fx^2*fyy]/fy^3
f(x,y)=log(x)+exp(-y/x)
InMatlab:
>> syms x y
>> f=log(x)+exp(-y/x);
>> fx=diff(f,x)
fx =
1/x+y/x^2*exp(-y/x)
>> fy=diff(f,y)
fy =
-1/x*exp(-y/x)
>> fxx=diff(fx,x)
fxx =
-1/x^2-2*y/x^3*exp(-y/x)+y^2/x^4*exp(-y/x)
>> fxy=diff(fx,y)
fxy =
1/x^2*exp(-y/x)-y/x^3*exp(-y/x)
>> fyy=diff(fy,y)
fyy =
1/x^2*exp(-y/x)
>> d2y=[2*fx*fy*fxy-fy^2*fxx-fx^2*fyy]/fy^3
d2y =
-(-(2/x+2*y/x^2*exp(-y/x))/x*exp(-y/x)*(1/x^2*exp(-y/x)-y/x^3*exp(-y/x))-1/x^2*exp(-y/x)^2*(-1/x^2-2*y/x^3*exp(-y/x)+y^2/x^4*exp(-y/x))-(1/x+y/x^2*exp(-y/x))^2/x^2*exp(-y/x))*x^3/exp(-y/x)^3
5 楼
Guassfans [专家分:4090] 发布于 2008-01-14 23:02:00
[quote]
>> ddy=-diff(g,x)/diff(g,y)
[/quote]
第一种方法中这个论断是不对的,用第二种方法吧!
6 楼
yzq612 [专家分:0] 发布于 2008-01-18 17:00:00
多谢仁兄回复!
我的qq 50852253,有空向仁兄学习!
7 楼
yzq612 [专家分:0] 发布于 2008-01-18 17:00:00
多谢仁兄回复!
我的qq 50852253,有空多多交流!
我来回复