倍频调用一个函数作为另一个函数
问题描述:
我写了八度二分法,但不能占用其他函数的变量..倍频调用一个函数作为另一个函数
我的二分法代码如下:
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
答
你想要的是一个指向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
答
安迪已经给你答案如何解决这个问题。我只想补充为什么你会得到这个错误以及它的意思。请看下面的八度会议:
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
即,当你写g1
或g2
在这里,这是一个实际函数调用。拨打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
和g2
函数一样。
当你叫bisection(f1,0,5)
,你基本上是叫bisection(f1(),0,5)
,即你问八度评价功能f1
没有传递任何参数,并使用结果作为第一个输入参数为bisection
功能。由于函数f1
被定义为接受输入参数,并且您没有提供任何输入参数,所以八度音阶会投诉,当它试图根据f1
的定义评估y = x^2 - 4;
时,x
未作为输入参数传递,因此未定义。
因此,通过一项“功能”为可称为内你平分功能的任意说法,你需要通过一个功能手柄代替,这可以使用@f1
语法来创建。请阅读octave(或matlab)文档中的“匿名函数”。
呼叫中函数f1的参数'x'在哪里? –
请注意,此代码特定于八度btw。matlab不会运行这个;你可能想要移除matlab标签或改变代码以使其与matlab兼容 –