首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过matlab中的另一个函数文件调用.m文件

通过matlab中的另一个函数文件调用.m文件
EN

Stack Overflow用户
提问于 2014-10-22 14:51:47
回答 1查看 164关注 0票数 2

我的教授让我写一个程序来执行二分例程来找到一个方程的根。在继续之前,下面是到目前为止的程序文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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程序,用于在任何时候计算方程。看上去:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function [y]=fofx(x)

y=cos(x)-sin(x);

end

他希望我们输入fofx.m作为输入参数,这样就可以使用任何通用的等式.m文件。他给我们安排了一个测试程序来操作这个程序。测试例程(我不允许更改)是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(' ')

当我通过输入命令窗口调用程序时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bisect(@fofx,0.7,0.9,1e-6)

平分完美地工作。但是当他的测试例程使用这一行时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[l,r,nfb] = bisect('fofx',0.7,0.9,1e-6)   

即使我将其输入命令窗口,也会得到以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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); 

有谁可以帮我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-22 17:00:56

str2func

问题是,bisect函数希望fname是一个函数句柄。如果fname是字符串,用于指示传递参数的括号实际上是字符串数组的索引,如果索引不是整数或逻辑,则MALTAB抛出该错误。

最好的做法是在进入例程之前进行一些预先输入检查。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数(函数句柄或函数名(字符串)除外)作为第一个参数,函数的输入作为后续参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vala = feval(fname,a);

我认为这有点笨重,但这是MATLAB中的ode套件使用的过程,这就是为什么ode45的第一个参数可以是句柄或字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26518458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文