我在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
答案 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
即,当您在此处写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
和{{ 1}}函数。
当你调用g2
时,你基本上调用bisection(f1,0,5)
,即你要求octave在不传递任何参数的情况下评估函数bisection(f1(),0,5)
,并使用结果作为第一个输入参数f1
功能。由于函数bisection
被定义为接受输入参数而您没有提供任何参数,因此八度音符会在尝试根据f1
的定义评估y = x^2 - 4;
时抱怨f1
}未作为输入参数传递,因此未定义。
因此,要将“函数”作为任意参数传递,可以在里面调用你的二分函数,你需要传递函数 handle ,这可以是使用x
语法创建。阅读octave(或matlab)文档中的“匿名函数”。