2017-06-03 309 views
0

我写了八度二分法,但不能占用其他函数的变量..倍频调用一个函数作为另一个函数

我的二分法代码如下:

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 
+0

呼叫中函数f1的参数'x'在哪里? –

+0

请注意,此代码特定于八度btw。matlab不会运行这个;你可能想要移除matlab标签或改变代码以使其与matlab兼容 –

回答

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

安迪已经给你答案如何解决这个问题。我只想补充为什么你会得到这个错误以及它的意思。请看下面的八度会议:

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()里面的接收它们作为参数的函数,它就像调用原来的g1g2函数一样。

当你叫bisection(f1,0,5),你基本上是叫bisection(f1(),0,5),即你问八度评价功能f1没有传递任何参数,并使用结果作为第一个输入参数为bisection功能。由于函数f1被定义为接受输入参数,并且您没有提供任何输入参数,所以八度音阶会投诉,当它试图根据f1的定义评估y = x^2 - 4;时,x未作为输入参数传递,因此未定义。

因此,通过一项“功能”为可称为你平分功能的任意说法,你需要通过一个功能手柄代替,这可以使用@f1语法来创建。请阅读octave(或matlab)文档中的“匿名函数”。

相关问题