2017-06-03 115 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)文檔中的「匿名函數」。

相關問題