二分法:无法使用函数以及如何处理多个函数输入

时间:2016-02-11 16:03:22

标签: matlab function numerical-methods approximation

我有一个工作二分法但我需要在一个函数中实现它,它将采用三个参数:f使用的函数,xL是边界的左边,xR是边界的右边。此外,它必须能够根据x的值改变函数(例如,如果函数是f(x))。如果x小于或等于零,则f(x)将为x ^ 3 + 3x + 1,如果x大于零,则f(x)将为1 + sin(x)。该函数需要输出根和执行的迭代次数

如何为f传递函数是函数参数,然后如何找到x的值来确定使用哪个函数?

以下是我与控制台输入相关的错误:

>> f = inline('x^3 + 3x + 1', 'x')

f =

 Inline function:
 f(x) = x^3 + 3x + 1

>> bisectionF(f,-2,0.1)
Undefined function or variable 'bisectionF'.

>> bisectionF(f,-2,0.1)
Undefined function or variable 'B'.

Error in bisectionF (line 3)
maxIters = 20;B

>> bisectionF(f,-2,0.1)
Error using inlineeval (line 14)
Error in inline expression ==> x^3 + 3x + 1
Error: Unexpected MATLAB expression.

Error in inline/feval (line 33)
    INLINE_OUT_ = inlineeval(INLINE_INPUTS_, INLINE_OBJ_.inputExpr,     INLINE_OBJ_.expr);

Error in bisectionF (line 7)
fM = feval(f,xM);

>> y = bisectionF('f1',-2,0.1)
Error using feval
Undefined function 'f1' for input arguments of type 'double'.

Error in bisectionF (line 9)
fM = feval(f,xM);

>> f1 = inline('x^3 + 3x + 1', 'x');
>> root = bisectionF(f1,-2,0.1)
Error using inlineeval (line 14)
Error in inline expression ==> x^3 + 3x + 1
Error: Unexpected MATLAB expression.

Error in inline/feval (line 33)
    INLINE_OUT_ = inlineeval(INLINE_INPUTS_, INLINE_OBJ_.inputExpr,   INLINE_OBJ_.expr);

Error in bisectionF (line 9)
fM = feval(f,xM);

这是我的代码:

function[r, iters] = bisectionF(f,xL,xR)
%f1 = inline('x^3 + 3x + 1', 'x');
%f2 = inline('1+sin(x)','x');

maxIters = 20;
precision = 10^(-5);
for j = 1:maxIters
    xM=(xL + xR)/ 2; 
    fM = feval(f,xM);
    fL = feval(f,xL);
    fR = feval(f,xR);
    if fM * fL < 0
       xR = xM
    elseif fM * fR < 0
       xL = xM;
    end
    if abs(fM) < precision
       disp(['Iterations performed: ', num2str(j)])
       disp('Convergence was reached')
    elseif(j==20)
       disp('The maximum number of iterations were performed')
    end
    r = xM;
    iters = j;
end

1 个答案:

答案 0 :(得分:0)

您不仅可以传递内联函数作为输入,还可以传递内联的集合(单元格)。在主脚本(或命令窗口)中,您可以按如下方式声明此类单元格数组:

f1 = inline('x^3 + 3*x + 1', 'x');
f2 = inline('1+sin(x)','x');
CandidateFunctions{1}=f1;
CandidateFunctions{2}=f2;

并将CandidateFunctions作为bisectionF的输入(而不是单个函数f)。

现在在bisectionF内,在

行之后
xM=(xL + xR)/ 2; 

您可以设置if/else开关:

if xM<=0
    f=CandidateFunctions{1}
else
    f=CandidateFunctions{2}
end

以这种方式,您在每次迭代时重新分配/覆盖f,具体取决于xM是正数,负数还是空。