はじめに

MATLABは「行列演算が得意」というイメージが強いかもしれませんが、実は非線形関数についても多様な演算・最適化・可視化をサポートしています。本記事では、**「非線形関数の演算」**に関するキーポイントとして以下のトピックを解説します。

  1. 関数ハンドルの作成
  2. 関数を別の関数に渡す

これらをマスターすることで、柔軟に関数を扱うプログラムを書けるようになります。非線形方程式の解法や最適化、数値積分など、MATLABの豊富なツールボックスをより活用できるようになるでしょう。

キーワード再掲:MATLAB, 非線形関数, 関数ハンドル, 関数を別の関数に渡す, べき乗, 数値積分, fzero, fminsearch


1. 関数ハンドルの作成

1.1 関数ハンドルとは

MATLABにおける関数ハンドルとは、「ある関数を指し示すポインタ」のようなものです。@ 記号を使い、関数を“オブジェクト”として扱えるようにします。これにより、変数と同じように関数を引数として渡す、配列に格納するなど、動的な処理が可能になります。

1.2 基本的な作り方

最もシンプルな例は、匿名関数(anonymous function) を使った関数ハンドルです。以下のように定義します。

f は x を入力として x^3 + 2\sin(x) - 1 を返す関数ハンドルになります。複数の入力引数や、行列演算にも対応可能です。

% 匿名関数を定義
f = @(x) x.^3 + 2*sin(x) - 1; % 入力xに対して f(x) = x^3 + 2*sin(x) - 1 を計算する関数ハンドルを作成

% コマンドウィンドウで評価
disp('f(0):');                  % f(0)の結果を表示
disp(f(0));                     % f(0) を計算して表示

disp('f(1):');                  % f(1)の結果を表示
disp(f(1));                     % f(1) を計算して表示

disp('f(pi):');                 % f(pi)の結果を表示
disp(f(pi));                    % f(pi) を計算して表示

% 関数の形状を可視化
figure;                         % 新しい図ウィンドウを作成
fplot(f, [-2, 2]);              % 区間[-2, 2]で関数fをプロット
grid on;                        % グリッドを表示して見やすくする
title('関数 f(x) = x^3 + 2sin(x) - 1 のグラフ'); % グラフタイトルを設定
xlabel('x');                    % x軸ラベル
ylabel('f(x)');                 % y軸ラベル

図1.匿名関数の定義例


2. 関数を別の関数に渡す

2.1 代表的なシーン:数値積分や最適化

MATLABで数値的な処理を行う際、関数ハンドルを別の関数に渡すシーンがよくあります。代表的な例は次のとおりです。

  • 数値積分: integralquad 系関数
  • 方程式の根を探す: fzero, fsolve
  • 最小化・最適化: fminsearch, fminunc, fmincon

これらは「引数として受け取った“何らかの関数”に対して、解を求める/積分をする」という仕組みになっています。そのため、MATLABでは関数ハンドルで表現された関数が必要になります。

2.1.1 数値積分の例

先ほど定義した関数 f を使って、f の定積分を 0 から 2 まで求めるには、次のように記述します。

これで \int_{0}^{2} \left(x^3 + 2\sin(x) - 1\right) dx が数値的に求まります。

% 匿名関数を定義
f = @(x) x.^3 + 2*sin(x) - 1; % 入力xに対して f(x) = x^3 + 2*sin(x) - 1 を計算する関数ハンドルを作成

result_integral = integral(f, 0, 2);
disp('関数fの定積分[0 2]')
disp(result_integral)

図2.数値積分の例

2.1.2 非線形方程式の解

例えば、fzero を用いて方程式 f(x)=0の解を探す場合、関数ハンドル f と初期値を指定します。

% 匿名関数を定義
f = @(x) x.^3 + 2*sin(x) - 1;   % 入力xに対して f(x) = x^3 + 2*sin(x) - 1 を計算する関数ハンドルを作成

% fzero を使用して解を探索
x_root = fzero(f, 1);           % x=1付近で f(x) = 0 となる解を探索
disp('x=1付近で解を探索:');     % 解探索についてのメッセージを表示
disp(x_root);                   % 見つかった root の値をコマンドウィンドウに表示

% グラフのプロット
figure;                         % 新しい図ウィンドウを作成
fplot(f, [-2, 2], 'LineWidth', 1.5); % 区間[-2, 2]で関数 f をプロット
hold on;                        % グラフを保持してマーカーを追加
plot(x_root, 0, 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r'); % 見つかった root を赤い点でマーク
hold off;                       % グラフ保持を解除

% グラフの装飾
title('f(x) = x^3 + 2sin(x) - 1 と root の可視化'); % グラフのタイトルを設定
xlabel('x');                    % x軸ラベルを設定
ylabel('f(x)');                 % y軸ラベルを設定
grid on;                        % グリッドを表示して見やすくする
legend('f(x)', 'root', 'Location', 'best'); % 凡例を追加

図3.数値積分の例

2.2 複数引数を扱う場合

複数のパラメータを持つ関数を最適化したい場合、無名関数内で追加の変数を扱うことができます。

外部で定義した a, b を匿名関数 g 内で参照できます。

a = 2;
b = -1;
g = @(x) x.^3 + a*sin(x) + b;

root_g = fzero(g, 0);
disp(root_g);

表1.主要な関数ハンドル

関数名用途
integral関数の定積分integral(@(x) x^2, 0,1)
fzero1変数の非線形方程式の解fzero(@(x) x.^3 - 2, 1)
fsolve多変数の非線形方程式の解fsolve(@(x) [x(1)^2-2; x(2)^3-3], [1;1])
fminsearch1変数/多変数の最小化 (単純形法)fminsearch(@(x) x(1)^2 + x(2)^2, [1;1])

まとめ

本記事では、MATLABでの非線形関数の演算を効率よく行うためのポイントとして、以下の2つを中心に解説しました。

  1. 関数ハンドルの作成
    • @ 記号を用いる匿名関数
    • 外部変数を取り込む方法
  2. 関数を別の関数に渡す
    • integral, fzero, fminsearch など、関数ハンドルを引数に取るMATLAB組み込み関数の例

非線形関数は、線形関数とは異なり局所解が存在する場合や複雑な形状を持つ場合が多々あります。MATLABの豊富な数値手法と組み合わせれば、非線形方程式の解や最適化、積分などを強力かつ柔軟に扱うことが可能です。


さらなる学習リソース

  • MathWorks公式ドキュメント(日本語)
    MATLABの匿名関数や関数ハンドルに関するドキュメント
  • MATLAB Answers (Q&Aフォーラム)
    関数ハンドルや数値解法に関する具体的な質問が多数寄せられています。
  • YouTube MathWorks公式チャンネル
    動画形式のチュートリアルで、非線形方程式や最適化の手順を見ることも可能。

キーワード再掲:MATLAB, 非線形関数, 関数ハンドル, 関数を別の関数に渡す, べき乗, 数値積分, fzero, fminsearch