【问题标题】:Gradient of a function handle函数句柄的梯度
【发布时间】:2017-05-13 16:58:31
【问题描述】:

我正在尝试在Matlab中计算一个函数句柄的梯度,以备后用。

例如:

fun = @(x) x(1)^2+ 2*x(2)

grad_fun = @(x) gradient(fun(x))

如果我检查这个:grad_fun([1;1]) 我收到 0。

对于所有值,我得到的都是零。

有人可以帮帮我吗?

提前致谢!

【问题讨论】:

  • grad_fun([1;10]) 的结果是什么?
  • 结果是:ans = 0
  • 如果你想计算 grad_fun([1;10]​​) ,首先这个传递给 fun 并且因为 fun=@(x) x(1)^2+2x(2) 和 x=[1 ;10] 所以很有趣会很有趣([1;2])=1^2+2*2 and fun=5 and gradient(5) or fun(any scalar number) will be 0(zero)

标签: matlab gradient


【解决方案1】:

首先创建一个带有句柄和符号变量的函数

syms x y z

fxyz = @(x,y,z) x^2+y^2-2*z^2+z*log(x)

您可以一次只针对一个变量进行微分。

先是 d/dx,然后是 d/dy,以此类推...

Dx = diff(fxyz,x)
Dy = diff(fxyz,y)
Dz = diff(fxyz,z)

最后将所有这些组合成一个函数

nabla = [Dx, Dy, Dz]

结果是

注意这是一个符号类。您需要在某些时候使用 subs() 来评估此函数,比如说 p = (1,2,3)

ans = sum(subs(nabla,[x y z], [1 2 3]))
ans = -3 

【讨论】:

    【解决方案2】:

    fun 内联函数返回一个标量值。换句话说,你试图得到一个常数的梯度。 gradient 函数的单个参数必须是矩阵或行向量。详情请见MathWorks Documentation

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 2017-09-21
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多