私はfzero関数を使って1つのパラメータ に応じて非線形方程式を解いていますが、私の方法には満足できません。私はこれらの問題があります:MatlabやOctaveでfzeroを使うとループや複雑な解を避ける
1)パラメータのforループは避けられますか?
2)複雑な解を避けるために、まずfzeroの有効区間を事前に計算する必要があります。 ここにはより良い解決策がありますか?
パラメータのステップサイズを小さくすると、実行時間が遅くなります。 の間隔をあらかじめ計算していないと、「区間のエンドポイントの関数値は有限で実数でなければならない」というエラーが表示されます。 Matlabでは 、Octaveでは "fzero:有効ではない初期ブラケット"となります。
ここコードMATLABに
% solve y = 90-asind(n*(sind(90-asind(sind(a0)/n)-y)))
% set the equation paramaters
n=1.48; a0=0:0.1:60;
% loop over a0
for i = 1:size(a0,2)
% for each a0 find where the argument of outer asind()
% will not give complex solutions, i.e. argument is between 1 and -1
fun1 = @(y) n*(sind(90-asind(sind(a0(i))/n)-y))-0.999;
y1 = fzero(fun1,[0 90]);
fun2 = @(y) n*(sind(90-asind(sind(a0(i))/n)-y))+0.999;
y2 = fzero(fun2,[0 90]);
% use y1, y2 as limits in fzero interval
fun3 = @(y) 90-asind(n*(sind(90-asind(sind(a0(i))/n)-y)))-y;
y(i) = fzero(fun3, [y1 y2]);
end
% plot the result
figure; plot(y); grid minor;
xlabel('Incident ray angle [Deg]');
ylabel('Lens surface tangent angle');
おかげで、コードは単純かつ明確に見えます。あなたのソリューションはOctave 4.0でも動作しますが、エラーや警告はありません。 – miquo