パラメ,タ,の変化に応じた方程式の解の追跡
この例では,パラメーターが変化したときに,前回の解の点から後続の求解を始めることで,方程式を繰り返し解く方法を示します。多くの場合,このプロセスで効率的に解を求めることができます。ただし、解が見つからないこともあり、その場合は新しい点から開始する必要があります。
パラメ,タ,付きスカラ,方程式
これから解くパラメ,タ,付き方程式は次のとおりです。
,
ここで, は0 ~ 5の数値パラメタです。 の場合,この方程式の解の1は です。 の絶対値が大きすぎない場合,この方程式には3の解があります。方程式を視覚化するために,方程式の左辺を無名関数として作成します。関数をプロットします。
Fun = @(x)sinh(x) - 3*x;T = linspace(-3.5,3.5);情节(t (t), t, 0(大小(t)),“k -”)包含(“x”) ylabel (“乐趣”(x))
が大きすぎるか小さすぎる場合,解は1のみになります。
問題ベ,スの設定
問題ベ,スのアプロ,チで目的関数を作成するには,最適化変数x
の最適化式expr
を作成します。
X = optimvar(“x”);Expr = sinh(x) - 3*x;
解の作成とプロット
での初期解
から開始して,
が0から5までの100個の値での解を求めます。有趣的
はスカラ,非線形関数であるため,解决
はソルバ,としてfzero
を呼び出します。
問題オブジェクト,オプション,解の統計量を保持するためのデ,タ構造体を設定します。
Prob = eqnproblem;选项= optimset(“显示”,“关闭”);Sols = 0 (100,1);发热= sols;As = linspace(0,5);
最初の解Sols (1) = 0
から開始して,ル,プで方程式を解きます。
为I = 2:长度为x0。X = sols(i-1);%从以前的解决方案开始概率。方程= expr == as(i);[sol,~,~,output] = solve(prob,x0,“选项”、选择);Sols (i) = sol.x;fevals(i) = output.funcCount;结束
パラメタ一个
の関数として解をプロットし,解に到達するまでに行った関数評価の回数もプロットします。
次要情节(2,1,1)情节(溶胶,“柯”)包含“一个”ylabel (“解决方案(x)”)次要情节(2,1,2)情节(发烧,“k *’)包含(的迭代次数) ylabel (函数宏指令的)
付近で解が急に変化します。同じ点で,解に到達するまでの関数評価の回数が15付近から40付近に増加します。理由を理解するために,関数のより詳細なプロットを確認します。関数とともに,解の点を7ごとにプロットします。
图t = linspace(-3.5,3.5);有趣的情节(t (t));持有在情节([-3.5,最小(溶胶)],[2.5,2.5],“k——”)传说(“有趣”,“最大的一个”,“位置”,“北”,“自动更新”,“关闭”)为A0 = 7:7:100 plot(sols(A0),as(A0),“罗”)如果国防部(a0, 2) = = 1的文本(溶胶(a0) + 0.15 (a0) + 0.15, num2str (a0/7))其他的Text (sols(a0) - 0.3,as(a0) + 0.05,num2str(a0/7))结束结束情节(t, 0(大小(t)),“k -”)举行从
が増加すると,最初は解が左へ動いていきます。しかし,
が2.5を超えると,前回の解に近い解はなくなります。fzero
では,解を探索してX = 3
付近の解を求めるために,追加の関数評価が必要になります。その後,
がさらに増加するにれて,解の値は徐々に右へ動いていきます。それ以降の解にいてはそれぞれ,ソルバで必要な関数評価は約10回だけです。
別のソルバ,の選択
fsolve
ソルバ,は,fzero
よりも効率的な場合があります。ただしfsolve
は,局所的最小値に陥ったり,方程式が解けなかったりすることもあります。
問題オブジェクト,オプション,解の統計量を保持するためのデ,タ構造体を設定します。
问题= eqnproblem;Sols = 0 (100,1);发热= sols;Infeas = sol;Asfsolve = linspace(0,5);
最初の解Sols (1) = 0
から開始して,ル,プで方程式を解きます。
为I = 2:长度为x0。X = sols(i-1);%从以前的解决方案开始probfsolve。方程= expr == asfsolve(i);[sol,fval,~,output] = solve(problem,x0,“选项”选项,“规划求解”,“fsolve”);Sols (i) = sol.x;fevals(i) = output.funcCount;infas (i) = fval;结束
パラメタ一个
の関数として解をプロットし,解に到達するまでに行った関数評価の回数もプロットします。
次要情节(2,1,1)情节(asfsolve溶胶,“柯”asfsolve infeas,的r -)包含“一个”传奇(“解决方案”,“解的错误”,“位置”,“最佳”)次要情节(2,1,2)情节(发烧,“k *’)包含(的迭代次数) ylabel (函数宏指令的)
fsolve
はfzero
よりも多少効率的であり,必要な関数評価は反復ごとに約7 ~ 8回です。この場合も,ソルバーが前回の値の付近で解を見つけられないと,解を探索するために必要な関数評価の回数が増えます。今回は探索に失敗しています。以降の反復では,必要な関数評価の回数は概ね減っていますが,解を見けることができていません。解法误差
のプロットは,関数値
を示しています。
局所的最小値が解にならない状況に対処するには,fsolve
が負の終了フラグを返した場合に,別の開始点から探索を再度行います。問題オブジェクト,オプション,解の統計量を保持するためのデ,タ構造体を設定します。
rng默认的%用于再现性Sols = 0 (100,1);发热= sols;Asfsolve = linspace(0,5);
最初の解Sols (1) = 0
から開始して,ル,プで方程式を解きます。
为I = 2:长度为x0。X = sols(i-1);%从以前的解决方案开始probfsolve。方程= expr == asfsolve(i);[sol,~,exitflag,output] = solve(problem,x0,“选项”选项,“规划求解”,“fsolve”);而Exitflag <= 0%如果fsolve无法找到解决方案x0。x=5*randn;从一个新的起点再试一次fevals(i) = fevals(i) + output.funcCount;[sol,~,exitflag,output] = solve(problem,x0,“选项”选项,“规划求解”,“fsolve”);结束Sols (i) = sol.x;fevals(i) = fevals(i) + output.funcCount;结束
パラメタ一个
の関数として解をプロットし,解に到達するまでに行った関数評価の回数もプロットします。
次要情节(2,1,1)情节(asfsolve溶胶,“柯”)包含“一个”ylabel (“解决方案(x)”)次要情节(2,1,2)情节(发烧,“k *’)包含(的迭代次数) ylabel (函数宏指令的)
今度は,fsolve
が
付近の不適切な初期点から復帰し,fzero
で取得した解とほぼ同じ解を取得しています。反復ごとの関数評価の回数はほとんどが8回であり,解が急に変化した点で約30回まで増加しています。
fcn2optimexpr
を使用した目的関数の変換
一部の目的関数またはソフトウェアバ,ジョンでは,fcn2optimexpr
を使用して,非線形関数を最適化式に変換しなければなりません。詳細は,最適化変数および式でサポ,トされる演算と非線形関数から最適化式への変換を参照してください。この例では,次のように,プロットに使用される元の関数有趣的
を最適化式expr
に変換します。
Expr = fcn2optimexpr(fun,x);
expr
の定義を変更しましたが,この例の続く部分はまったく同じです。