首页 文章

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

提问于
浏览
0

我有一个工作二分法但我需要在一个函数中实现它,它将采用三个参数: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

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

    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 是正数,负数还是空 .

相关问题