陰関数を一度に解く方法
9 ビュー (過去 30 日間)
古いコメントを表示
陰関数をfor/endを使わずに、配列で一度に解く為に、つぎのコードを書きました。
しかし、x_values=[3,4,5]に対して、yが[0,0,0]になっており、算出できていません。
間違っているところのご教示をよろしくお願いします。
% 陰関数の定義
f = @(xy) xy(1)^2 + xy(2)^2 - 25;
% xの値をベクトルで指定
x_values = [3, 4, 5];
% 初期推定値をベクトル化
initialGuess = zeros(length(x_values), 2);
initialGuess(:, 1) = x_values;
% fsolveを使用して方程式を解く
options = optimoptions('fsolve', 'Algorithm', 'levenberg-marquardt');
solutions = fsolve(f, initialGuess, options);
% 結果の表示
disp('各xに対する算出されたyの値:');
% disp(solutions(:, 2));
disp(solutions);
-----------------------
出力結果は次の通りです。
方程式は初期点で解かれました。
初期点における関数値のベクトルがゼロに近く
(関数の許容誤差値による測定)、
問題が正則として現れる (勾配による測定) ため、fsolve は完了しました。
<停止条件の詳細>
各xに対する算出されたyの値:
3 0
4 0
5 0
採用された回答
Atsushi Ueno
2023 年 12 月 23 日
- 「2次元配列の1列目に初期条件を与えると2列目に解が出力される」訳ではありません。
- 初期条件([3;4;0]は既に解になっています。fsolve 関数は何もせずそのまま解として出力しています
- 初期条件のサイズは2行1列で十分です(おそらく最初は25でなくxy(3)としていたと想定します)
- 解は[3;4]以外にもたくさん存在します。狙いの値に定めるには制約条件の設定が必要です
options = optimoptions('fsolve','Algorithm','levenberg-marquardt','Display','iter');
f = @(xy) xy(1)^2 + xy(2)^2 - 25;
initialGuess = rand(3,1);
[solutions,fval] = fsolve(f, initialGuess, options)
initialGuess = [3 4]; % 初期条件が既に解なので、イタレーションが1度しか回らずに済む
[solutions,fval] = fsolve(f, initialGuess, options)
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!