2017-01-19 58 views
1

問題

是什麼意思「FUN必須是一個字符串或內聯函數」,在八度的消息?八度「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 

回答

3

看來vectorize需要一個字符串字面量,並無法從一個象徵性的表達獲得功能句柄,但是你可以用function_handle代替:

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) 

enter image description here

相關問題