1

MatlabでRidderのメソッドの適切な実装を作成する必要があります。関数を次のように定義する必要があります

function [x sol, f at x sol, N iterations] = Ridders(f, x1, x2, eps f, eps x)

私が与えられた説明は次のとおりです。

  1. 根を括弧で囲む(x1、x2)

  2. 中点を評価する(x1 + x2)/ 2

  3. ルートの新しい近似を見つける

    x4 = x3 + sign(f1 - f2) [f3/((f3)^2 - f1f2)^1/2)](x3 - x1)

  4. x4が収束条件を満たすかどうかを確認します。はいの場合、停止します。そうでない場合...

  5. x4を使用してルートを再ブラケットし、x1、x2、またはx3のいずれかがルートに近い方

  6. 1にループバック

これをmatlabに実装する方法がわかりません。ヘルプ?

4

3 に答える 3

1

Matlabでは、関数を次のように定義します。

function [list of outputs] = myfunc(list of input variables)

    %function definition to compute outputs using the input variables.

あなたの場合、x4(つまりルート)を出力にしたい場合は、次のようにします。

function root  = riddler(func, x1, x2, xaccuracy, N)


    xl = x1;
    xh = x2;
    fl=func(x1)
    fh=func(x2)

   for i = 1:N
       xm = 0.5*(xl+xh);
       fm = func(xm);
       s = sqrt(fm*fm - fl*fh)
       if s == 0
         return;
       end
       xnew = xm + (xm - xl)*sign(fl - fh)*fm/s %update formula
       .
       .
       . % extra code to check convergence and assign final answer for root 
       . % code to update xl, xh, fl, fh, etc. (i.e rebracket)
       .

    end % end for
于 2012-09-16T21:21:40.660 に答える
0

役立つ可能性のあるいくつかの主要な概念:

  • 関数ハンドル(この形式でfを指定する必要があります)
  • 有効な変数名(定義内の多くの変数名は無効です)
于 2012-09-17T08:28:29.340 に答える
0

私は、Matlabファイル交換でRidderのメソッドのMatlab実装を作成しました:submission54458。参考までに、以下のコードをコピーしました。

function xZero = rootSolve(func,xLow,xUpp)
% XZERO = ROOTSOLVE(FUNC, XLOW, XUPP)
%
% FUNCTION: This function uses Ridder's Method to return a root, xZero,
%     of func on the interval [xLow,xUpp]
%
% INPUTS:
%   func = a function for a SISO function: y = f(x)
%   xLow = the lower search bound
%   xUpp = the upper search bound
%
% OUTPUTS:
%   xZero = the root of the function on the domain [xLow, xUpp]
%
% NOTES:
%   1) The function must be smooth
%   2) sign(f(xLow)) ~= sign(f(xUpp))
%   3) This function will return a root if one exists, and the function is
%   not crazy. If there are multiple roots, it will return the first one
%   that it finds.

maxIter = 50;
fLow = feval(func,xLow);
fUpp = feval(func,xUpp);
xZero = [];

tol = 10*eps;

if (fLow > 0.0 && fUpp < 0.0) || (fLow < 0.0 && fUpp > 0.0)
    for i=1:maxIter
        xMid = 0.5*(xLow+xUpp);
        fMid = feval(func,xMid);
        s = sqrt(fMid*fMid - fLow*fUpp);
        if s==0.0, break; end
        xTmp = (xMid-xLow)*fMid/s;
        if fLow >= fUpp
            xNew = xMid + xTmp;
        else
            xNew = xMid - xTmp;
        end
        xZero = xNew;
        fNew = feval(func,xZero);
        if abs(fNew)<tol, break; end

        %Update
        if sign(fMid) ~= sign(fNew)
            xLow = xMid;
            fLow = fMid;
            xUpp = xZero;
            fUpp = fNew;
        elseif sign(fLow) ~= sign(fNew)
            xUpp = xZero;
            fUpp = fNew;
        elseif sign(fUpp) ~= sign(fNew)
            xLow = xZero;
            fLow = fNew;
        else
            error('Something bad happened in riddersMethod!');
        end

    end
else
    if fLow == 0.0
        xZero = xLow;
    elseif fUpp == 0.0
        xZero = xUpp;
    else
        error('Root must be bracketed in Ridder''s Method!');
    end
end
于 2016-07-16T14:47:17.587 に答える