我的教授让我写一个程序来执行二分例程来找到一个方程的根。在继续之前,下面是到目前为止的程序文件:
function [l,r,nf] = bisect(fname,a,b,tol)
nf=0;
if (fname(a)*fname(b))>0
errflag='Choose an interval (a,b) where f(a)*f(b) is negative'
root='N/A'
else
while abs(fname(a)-fname(b))>tol
p=a+(b-a)/2;
if (fname(a)*fname(p))<0
b=p;
else
a=p;
end
nf=nf+1;
end
end
nf
l=a
r=b
end
除了bisect.m
文件之外,他还让我们编写了一个简单的fofx.m
程序,用于在任何时候计算方程。看上去:
function [y]=fofx(x)
y=cos(x)-sin(x);
end
他希望我们输入fofx.m
作为输入参数,这样就可以使用任何通用的等式.m文件。他给我们安排了一个测试程序来操作这个程序。测试例程(我不允许更改)是
try
delete('prog4run');
end
diary prog4run
format long e
[l,r,nfb] = bisect('fofx',0.7,0.9,1e-6);
p = l+(r-l)/2;
disp(' ')
disp(' ')
disp(' Bisect output:')
disp('root approx:'),p
disp(' ')
disp('error:'),abs(p-pi/4)
disp(' ')
disp('number of fcn evals:'),nfb
disp(' ')
disp(' ')
当我通过输入命令窗口调用程序时:
bisect(@fofx,0.7,0.9,1e-6)
平分完美地工作。但是当他的测试例程使用这一行时:
[l,r,nfb] = bisect('fofx',0.7,0.9,1e-6)
即使我将其输入命令窗口,也会得到以下错误:
Attempted to access fname(0.7); index must be a positive integer or logical.
Error in bisect (line 5)
if (fname(a)*fname(b))>0
Error in SCProg4Test (line 13)
[l,r,nfb] = bisect('fofx',0.7,0.9,1e-6);
有谁可以帮我?
发布于 2014-10-22 17:00:56
str2func
问题是,bisect
函数希望fname
是一个函数句柄。如果fname
是字符串,用于指示传递参数的括号实际上是字符串数组的索引,如果索引不是整数或逻辑,则MALTAB抛出该错误。
最好的做法是在进入例程之前进行一些预先输入检查。例如:
if ~isa(fname,'function_handle')
if ischar(fname)
fname = str2func(fname);
else
error('Input ''fname'' must be either a function handle or the name of a valid function.')
end
end
如果fname
是一个字符串,该字符串也是当前工作目录中或MATLAB路径上文件的名称,str2func
将将其转换为句柄,一切都将正常。如果您想确保MATLAB能够找到文件,可以使用exist(fname,'file')==2
检查字符串是否是有效的文件名。
feval
您还可以使用feval
函数(函数句柄或函数名(字符串)除外)作为第一个参数,函数的输入作为后续参数:
vala = feval(fname,a);
我认为这有点笨重,但这是MATLAB中的ode
套件使用的过程,这就是为什么ode45
的第一个参数可以是句柄或字符串。
https://stackoverflow.com/questions/26518458
复制相似问题