隐微分 - 使用 Matlab 的二阶导数
Implicit differentiation - Second derivative using Matlab
等式是4*x^2-2*y^2==9
。使用隐式微分,我可以发现 y
关于 x
的二阶导数是 -9/y^3
,这需要在最后一步进行替换。
我正在尝试使用 Matlab 的符号工具箱复制这个答案。我确实找到了对一阶导数的一些支持 here,并且成功找到了一阶导数。
clear all
syms x y f
f=4*x^2-2*y^2-9
sol1=-diff(f,x)/diff(f,y)
但我无法继续寻找最终简化的二阶导数(将 4*x^2-2*y^2
替换为 9
)。
有人可以告诉我如何在 Matlab 中执行此操作吗?
据我所知,在 Matlab 中没有直接获得隐式二阶导数的方法。在 Matlab 中使用隐式函数可能相当棘手。首先,您的变量 y
是 x
的隐式函数,您应该这样定义它:
clear all
syms y(x) % defines both x and y
f = 4*x^2-2*y^2-9
这里的y(x)
就是现在所谓的arbitrary or abstract symbolic function,即没有明确公式的。然后取 f
关于 x
的导数:
s1 = diff(f,x)
这个 returns 是 y(x)
关于 x
、diff(y(x), x)
的隐式导数的函数(在这种情况下 diff(y)
是 shorthand).您可以使用 subs
and solve
:
以代数方式求解此函数 diff(y)
syms dydx % arbitrary variable
s2 = subs(s1,diff(y),dydx)
s3 = solve(s2,dydx)
这产生了第一个隐式导数。然后,您可以对该表达式求另一个导数,以获得作为第一个函数的第二个隐式导数:
s4 = diff(s3,x)
最后将一阶隐式导数的表达式代入,化简得到最终形式:
s5 = simplify(subs(s4,diff(y),s3))
这会产生 (2*(y(x)^2 - 2*x^2))/y(x)^3
。然后你可以使用 f
的原始表达式消除 x
并进一步替换和求解:
syms x2
f2 = subs(f,x^2,x2)
x2 = solve(f2,x2)
s6 = subs(s5,x^2,x2)
最后,如果需要,您可以将其转换回具有最终替换的显式代数表达式:
s7 = subs(s6,y,'y')
这会产生 -9/y^3
的解。
整个过程可以写得更简洁(但很不清晰)为:
clear all
syms y(x) dydx x2
f = 4*x^2-2*y^2-9;
s1 = solve(subs(diff(f,x),diff(y),dydx),dydx)
s2 = simplify(subs(subs(subs(diff(s1,x),diff(y),s1),x^2,solve(subs(f,x^2,x2),x2)),y,'y'))
我问这个问题已经快四年了,并得到了 horchler 的出色帮助,但我发现了另一种使用链式法则的方法。
syms x y
f=4*x^2-2*y^2-9
dydx=-diff(f,x)/diff(f,y)
d2ydx2=diff(dydx,x)+diff(dydx,y)*dydx
d2ydx2=simplifyFraction(d2ydx2,'Expand',true)
s1=solve(f,x)
subs(d2ydx2,x,s1(2))
等式是4*x^2-2*y^2==9
。使用隐式微分,我可以发现 y
关于 x
的二阶导数是 -9/y^3
,这需要在最后一步进行替换。
我正在尝试使用 Matlab 的符号工具箱复制这个答案。我确实找到了对一阶导数的一些支持 here,并且成功找到了一阶导数。
clear all
syms x y f
f=4*x^2-2*y^2-9
sol1=-diff(f,x)/diff(f,y)
但我无法继续寻找最终简化的二阶导数(将 4*x^2-2*y^2
替换为 9
)。
有人可以告诉我如何在 Matlab 中执行此操作吗?
据我所知,在 Matlab 中没有直接获得隐式二阶导数的方法。在 Matlab 中使用隐式函数可能相当棘手。首先,您的变量 y
是 x
的隐式函数,您应该这样定义它:
clear all
syms y(x) % defines both x and y
f = 4*x^2-2*y^2-9
这里的y(x)
就是现在所谓的arbitrary or abstract symbolic function,即没有明确公式的。然后取 f
关于 x
的导数:
s1 = diff(f,x)
这个 returns 是 y(x)
关于 x
、diff(y(x), x)
的隐式导数的函数(在这种情况下 diff(y)
是 shorthand).您可以使用 subs
and solve
:
diff(y)
syms dydx % arbitrary variable
s2 = subs(s1,diff(y),dydx)
s3 = solve(s2,dydx)
这产生了第一个隐式导数。然后,您可以对该表达式求另一个导数,以获得作为第一个函数的第二个隐式导数:
s4 = diff(s3,x)
最后将一阶隐式导数的表达式代入,化简得到最终形式:
s5 = simplify(subs(s4,diff(y),s3))
这会产生 (2*(y(x)^2 - 2*x^2))/y(x)^3
。然后你可以使用 f
的原始表达式消除 x
并进一步替换和求解:
syms x2
f2 = subs(f,x^2,x2)
x2 = solve(f2,x2)
s6 = subs(s5,x^2,x2)
最后,如果需要,您可以将其转换回具有最终替换的显式代数表达式:
s7 = subs(s6,y,'y')
这会产生 -9/y^3
的解。
整个过程可以写得更简洁(但很不清晰)为:
clear all
syms y(x) dydx x2
f = 4*x^2-2*y^2-9;
s1 = solve(subs(diff(f,x),diff(y),dydx),dydx)
s2 = simplify(subs(subs(subs(diff(s1,x),diff(y),s1),x^2,solve(subs(f,x^2,x2),x2)),y,'y'))
我问这个问题已经快四年了,并得到了 horchler 的出色帮助,但我发现了另一种使用链式法则的方法。
syms x y
f=4*x^2-2*y^2-9
dydx=-diff(f,x)/diff(f,y)
d2ydx2=diff(dydx,x)+diff(dydx,y)*dydx
d2ydx2=simplifyFraction(d2ydx2,'Expand',true)
s1=solve(f,x)
subs(d2ydx2,x,s1(2))