八度“FUN必须是字符串或内联函数”

时间:2017-01-19 00:11:57

标签: matlab octave

问题

Octave中“FUN必须是字符串或内联函数”的含义是什么意思?

在Octave 4.2.0(Windows)中我试图运行最初在MATLAB 7.8中实现的Gradients, Gradient Plots and Tangent Planes,并得到如下错误。

请建议这是因为Octave与MATLAB不兼容或由于其他原因。如果有解决方法,请提出建议。

>> syms x y z
>> f=((x^2-1)+(y^2-4)+(x^2-1)*(y^2-4))/(x^2+y^2+1)^2
f = (sym)

   2    2   / 2    \ / 2    \
  x  + y  + \x  - 1/*\y  - 4/ - 5
  -------------------------------
                        2
           / 2    2    \
           \x  + y  + 1/

>> gradf=jacobian(f,[x,y])
gradf = (sym 1x2 matrix)

  [      / 2    2   / 2    \ / 2    \    \       / 2    \              / 2    2
  [  4*x*\x  + y  + \x  - 1/*\y  - 4/ - 5/   2*x*\y  - 4/ + 2*x    4*y*\x  + y
  [- ------------------------------------- + ------------------  - -------------
  [                           3                             2
  [              / 2    2    \                 / 2    2    \                   /
  [              \x  + y  + 1/                 \x  + y  + 1/                   \

    / 2    \ / 2    \    \       / 2    \      ]
  + \x  - 1/*\y  - 4/ - 5/   2*y*\x  - 1/ + 2*y]
  ------------------------ + ------------------]
              3                             2  ]
   2    2    \                 / 2    2    \   ]
  x  + y  + 1/                 \x  + y  + 1/   ]

>> [xx, yy] = meshgrid(-3:.1:3,-3:.1:3);
>> ffun = @(x,y) eval(vectorize(f));
>> fxfun = @(x,y) eval(vectorize(gradf(1)));
>> fyfun = @(x,y) eval(vectorize(gradf(2)));
>> contour(xx, yy, ffun(xx,yy), 30)
error: vectorize: FUN must be a string or inline function
error: called from
    @<anonymous> at line 1 column 15

1 个答案:

答案 0 :(得分:3)

似乎vectorize需要字符串文字,并且无法从符号表达式获取函数句柄,但您可以使用https://mochajs.org/#hooks代替:

ffun = function_handle(f)

导致以下向量友好函数:

ffun =
@(x, y) (x .^ 2 + y .^ 2 + (x .^ 2 - 1) .* (y .^ 2 - 4) - 5) ./ (x .^ 2 + y .^ 2 + 1) .^ 2

可以向前使用,例如使用contour来电:

contour(xx, yy, ffun(xx,yy), 30)

function_handle