Octave将函数称为另一个函数的变量

时间:2017-06-03 18:31:51

标签: octave

我在Octave中写了一个二分法,但它不能使用另一个函数..

我的二分法方法代码如下:

function[x,b] = bisection(f,a,b)

  t = 10e-8

  while abs(b-a) > t;
    c = (a+b)/2;

    if f(a) * f(b) <= 0
       a = a;
       b = c;
    else 
       b = b;
       a = c
    endif
  endwhile

  x = (a+b)/2
endfunction

我已经有一个文件f1.m:

function y = f1(x)
  y = x^2 - 4;
endfunction

但是当我打电话给[x,v] = bisection[f1,0,5]时,我得到了:

>> [t,v] = bisection(f1,0,5)
   error: 'x' undefined near line 2 column 5
   error: called from
          f1 at line 2 column 3
   error: evaluating argument list element number 1

2 个答案:

答案 0 :(得分:1)

你想要的是将f1的指针传递给你的函数bisection,这样正确的调用就是

[t,v] = bisection(@f1,0,5)

输出:

t =    1.0000e-07
a =  0.62500
a =  0.93750
a =  1.0938
a =  1.1719
a =  1.2109
a =  1.2305
a =  1.2402
a =  1.2451
a =  1.2476
a =  1.2488
a =  1.2494
a =  1.2497
a =  1.2498
a =  1.2499
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
a =  1.2500
x =  1.2500
t =  1.2500
v =  1.2500

答案 1 :(得分:1)

安迪给了你如何解决这个问题的答案。我想补充一下为什么你会得到这个错误及其含义。考虑以下八度音程:

octave:1> function Out = g1(x); Out = x+5; end
octave:2> function Out = g2(); Out = 10;end
octave:3> 
octave:3> g2
ans =  10
octave:4> g1
error: 'x' undefined near line 1 column 29
error: called from
    g1 at line 1 column 27

即,当您在此处写g1g2时,这是实际函数调用。对g2的调用成功,因为g2不接受任何参数;语法g2基本上等同于g2()。但是,对g1的调用失败,因为g1需要参数,而我们没有提供参数。

与:比较:

octave:4> a = @g1;
octave:5> b = @g2;
octave:6> a
a = @g1
octave:7> a(1)
ans =  6
octave:8> b
b = @g2
octave:9> b()
ans =  10

您已经为这些函数创建了句柄,您可以将这些函数捕获到变量中,并将它们作为参数传递给函数。然后可以将这些句柄称为a(5)b() 里面的作为参数接收它们的函数,它就像调用原始g1和{{ 1}}函数。

当你调用g2时,你基本上调用bisection(f1,0,5),即你要求octave在不传递任何参数的情况下评估函数bisection(f1(),0,5),并使用结果作为第一个输入参数f1功能。由于函数bisection被定义为接受输入参数而您没有提供任何参数,因此八度音符会在尝试根据f1的定义评估y = x^2 - 4;时抱怨f1 }未作为输入参数传递,因此未定义。

因此,要将“函数”作为任意参数传递,可以在里面调用你的二分函数,你需要传递函数 handle ,这可以是使用x语法创建。阅读octave(或matlab)文档中的“匿名函数”。