主要内容

パラメ,タ,の変化に応じた方程式の解の追跡

この例では,パラメーターが変化したときに,前回の解の点から後続の求解を始めることで,方程式を繰り返し解く方法を示します。多くの場合,このプロセスで効率的に解を求めることができます。ただし、解が見つからないこともあり、その場合は新しい点から開始する必要があります。

パラメ,タ,付きスカラ,方程式

これから解くパラメ,タ,付き方程式は次のとおりです。

sinh x - 3. x 一个

ここで, 一个 は0 ~ 5の数値パラメタです。 一个 0 の場合,この方程式の解の1は x 0 です。 一个 の絶対値が大きすぎない場合,この方程式には3の解があります。方程式を視覚化するために,方程式の左辺を無名関数として作成します。関数をプロットします。

Fun = @(x)sinh(x) - 3*x;T = linspace(-3.5,3.5);情节(t (t), t, 0(大小(t)),“k -”)包含(“x”) ylabel (“乐趣”(x)

图中包含一个轴对象。axis对象包含2个line类型的对象。

一个 が大きすぎるか小さすぎる場合,解は1のみになります。

問題ベ,スの設定

問題ベ,スのアプロ,チで目的関数を作成するには,最適化変数xの最適化式exprを作成します。

X = optimvar(“x”);Expr = sinh(x) - 3*x;

解の作成とプロット

一个 0 での初期解 x 0 から開始して, 一个 が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 (函数宏指令的

图中包含2个轴对象。Axes对象1包含一个line类型的对象。坐标轴对象2包含一个line类型的对象。

一个 2 5 付近で解が急に変化します。同じ点で,解に到達するまでの関数評価の回数が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 -”)举行

图中包含一个轴对象。axis对象包含31个类型为line, text的对象。这些对象代表乐趣,最大值。

一个 が増加すると,最初は解が左へ動いていきます。しかし, 一个 が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 (函数宏指令的

图中包含2个轴对象。坐标轴对象1包含2个line类型的对象。这些对象表示解决方案、解决方案的错误。坐标轴对象2包含一个line类型的对象。

fsolvefzeroよりも多少効率的であり,必要な関数評価は反復ごとに約7 ~ 8回です。この場合も,ソルバーが前回の値の付近で解を見つけられないと,解を探索するために必要な関数評価の回数が増えます。今回は探索に失敗しています。以降の反復では,必要な関数評価の回数は概ね減っていますが,解を見けることができていません。解法误差のプロットは,関数値 f u n x - 一个 を示しています。

局所的最小値が解にならない状況に対処するには,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 (函数宏指令的

图中包含2个轴对象。Axes对象1包含一个line类型的对象。坐标轴对象2包含一个line类型的对象。

今度は,fsolve 一个 2 5 付近の不適切な初期点から復帰し,fzeroで取得した解とほぼ同じ解を取得しています。反復ごとの関数評価の回数はほとんどが8回であり,解が急に変化した点で約30回まで増加しています。

fcn2optimexprを使用した目的関数の変換

一部の目的関数またはソフトウェアバ,ジョンでは,fcn2optimexprを使用して,非線形関数を最適化式に変換しなければなりません。詳細は,最適化変数および式でサポ,トされる演算非線形関数から最適化式への変換を参照してください。この例では,次のように,プロットに使用される元の関数有趣的を最適化式exprに変換します。

Expr = fcn2optimexpr(fun,x);

exprの定義を変更しましたが,この例の続く部分はまったく同じです。

参考

||

関連するトピック