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