【问题标题】:Implicit differentiation - Second derivative using Matlab隐式微分 - 使用 Matlab 的二阶导数
【发布时间】:2018-07-30 11:40:02
【问题描述】:

等式是4*x^2-2*y^2==9。使用隐式微分,我可以发现yx 的二阶导数是-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 中做到这一点?

【问题讨论】:

  • 发布您的实际代码,而不是链接到另一个问题。
  • this 有帮助吗?
  • 你在找这个吗? sol = -diff(f,x,2)/diff(f,y,2)
  • @TommasoBelluzzo 代码 sol = -diff(f,x,2)/diff(f,y,2) 返回 sol=2 的答案,这是一个不正确的答案。最终答案应该是 -9/y^3。
  • @beaker 抱歉,该链接上没有隐式区分的示例。

标签: matlab symbolic-math derivative differentiation


【解决方案1】:

据我所知,没有直接的方法可以在 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,即没有明确的公式。然后取fx 的导数:

s1 = diff(f,x)

这会根据y(x) 相对于xdiff(y(x), x) 的隐式导数返回一个函数(在这种情况下,diff(y) 是简写)。你可以用subssolve代数求解diff(y)的这个函数:

syms dydx % arbitrary variable
s2 = subs(s1,diff(y),dydx)
s3 = solve(s2,dydx)

这产生了第一个隐式导数。然后,您可以对该表达式进行另一个导数,以获得作为第一个函数的第二个隐式导数:

s4 = diff(s3,x)

最后将一阶隐式导数的表达式代入 this 并化简得到最终形式:

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'))

还有许多其他方法可以达到相同的效果。另请参阅这两个教程:[1][2]

【讨论】:

  • 绝对精彩的演示。我正在使用 matlab 2014b,所以我不得不做 s5=simplify(subs(s4,diff(y(x),x),s3)) 因为 D(y)(x) 没有出现;而 2/y(x) - (2*x*diff(y(x), x))/y(x)^2 出现在 s4 中。最后一个问题是,如何扩展分子并将 4x^2-2y^2 替换为 -9?
  • 不客气。我已经更新了答案来解决这个问题。很多丑陋的替换来处理这个问题。
【解决方案2】:

我问这个问题已经快四年了,得到了 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))

【讨论】:

  • @horchler 刚刚添加了另一种方法。再次感谢您的帮助。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多