1

3 つのパラメーターで Chapman-Richards を解く方法を見つける必要があります。方程式は

F=a(1-EXP(-bt)) power c

これは非線形の問題です。目標はエラーを最小限に抑えることであり、制約は 3 つの変数が >= 0.0001 でなければならないことです。現在の実装では、Excel と Solver プラグイン (GRG 非線形法) を使用しています。しかし今は、Excel を使用せずにこれらすべてを実装する必要があります。

私の質問は次のとおりです。1. MS Solver Foundation を使用してこの問題を解決することは可能ですか? 私はいくつかのドキュメントを読んで、MS Solver Foundation が Nelder Mead Solver またはハイブリッド ローカル検索ソルバーのいずれかを使用して非線形問題を解決していることを理解しています。これらの方法を使用して特定の問題を解決できるかどうかは誰にもわかりませんか? また、Excel の Solver アドインの GRG 非線形法を使用した場合と同じ結果になりますか?

  1. そうでない場合、Excel ソルバーの GRG 非線形メソッドを実装することは可能ですか?

  2. これを実装する他の方法はありますか?

事前にご返信いただきありがとうございます。カー

補遺: 申し訳ありませんが、t が時間変数であることを忘れていました。a、b、および c は、ソルバーによって変更できるパラメーターです。

4

2 に答える 2

0

はい、Solver Foundation のNelder-Meadソルバーで実行できます。C# でのサンプル コードを次に示します。Microsoft.Solver.Foundationアセンブリを参照していることを確認してください。

    private const double t = 1.0;

    public static void Main()
    {
        var solver = new NelderMeadSolver();

        // Objective function.
        int objId;
        solver.AddRow("obj", out objId);
        solver.AddGoal(objId, 0, true);

        // Define variables.
        int aId, bId, cId;
        solver.AddVariable("a", out aId);
        solver.AddVariable("b", out bId);
        solver.AddVariable("c", out cId);

        // Define bounds.
        solver.SetLowerBound(aId, 0.001);
        solver.SetLowerBound(bId, 0.001);
        solver.SetLowerBound(cId, 0.001);

        // Assign objective function delegate.
        solver.FunctionEvaluator = FunctionValue;

        // Solve.
        var param = new NelderMeadSolverParams();
        var solution = solver.Solve(param);

        Console.WriteLine("The Result is " + solution.Result + ".");
        Console.WriteLine("The minimium objective value is " + 
                          solution.GetValue(objId) + ".");
        Console.WriteLine("a = " + solution.GetValue(aId) + ".");
        Console.WriteLine("b = " + solution.GetValue(bId) + ".");
        Console.WriteLine("c = " + solution.GetValue(cId) + ".");

        Console.ReadKey();
    }

    private static double FunctionValue(INonlinearModel model, int rowVid,
         ValuesByIndex values, bool newValues)
    {
        var a = values[model.GetIndexFromKey("a")];
        var b = values[model.GetIndexFromKey("b")];
        var c = values[model.GetIndexFromKey("c")];

        return a * Math.Pow(1.0-Math.Exp(-b * t), c);
    }
于 2012-11-29T14:11:11.623 に答える
0

Visual Studio 2013 と Visual Basic で解決しました。コードの翻訳があります。

Private Sub NelderMead()
    Dim Solver As New Microsoft.SolverFoundation.Solvers.NelderMeadSolver

    Dim objId As Integer
    Solver.AddRow("obj", objId)
    Solver.AddGoal(objId, 0, True)

    Dim aId, bId, cId As Integer
    Solver.AddVariable("a", aId)
    Solver.AddVariable("b", bId)
    Solver.AddVariable("c", cId)

    Solver.SetLowerBound(aId, 0.001)
    Solver.SetLowerBound(bId, 0.001)
    Solver.SetLowerBound(cId, 0.001)

    Solver.FunctionEvaluator = AddressOf FunctionValue

    Dim Par As New Microsoft.SolverFoundation.Solvers.NelderMeadSolverParams
    Dim Solucion = Solver.Solve(Par)

    Debug.Print(Solucion.Result)
End Sub

Function FunctionValue(Model As Microsoft.SolverFoundation.Services.INonlinearModel, _
                       rowVid As Integer, _
                       Values As Microsoft.SolverFoundation.Services.ValuesByIndex, _
                       newValues As Boolean) As Object
    Dim a, b, c As Double

    a = Values(Model.GetIndexFromKey("a"))
    b = Values(Model.GetIndexFromKey("b"))
    c = Values(Model.GetIndexFromKey("c"))

    Return a * Math.Pow(1.0 - Math.Exp(-b * t), c)
End Function
于 2015-01-16T23:36:16.180 に答える