データのプロットを得る方法

・(x,y)のデータをそれぞれ入力して(xに時間、yに吸光度を入力したい)グラフにプロットし、任意の近似式((y=a+bexp(-cx)など)で近似曲線を得るために、どんなコードを打てば良いのかがわかりません。コードの例を教えていただきたいです。

2 件のコメント

美音 奥居
美音 奥居 2021 年 5 月 28 日
ご回答ありがとうございます。Toolboxは持っています。宜しくお願い致します。

サインインしてコメントする。

 採用された回答

Atsushi Ueno
Atsushi Ueno 2021 年 5 月 29 日
編集済み: Atsushi Ueno 2021 年 5 月 29 日

0 投票

上記の公式回答がとても参考になるので、自分の目的にあった方法を探してください。
Toolboxの有無を伺いましたが、私がToolboxを持っていないので動作確認する事ができません。コメントに書いた類似質問を参考にしてToolbox不要なコード(fminsearchによる方法)を書いてみました。入力の測定点と近似曲線(ここではy=a+bexp(-cx))の誤差の二乗平方和が最小になるように最適化されます。
function main
X = (0:0.1:10)'; % XとYは適当なデータ
Y = 4.5+2.3.*exp(-1.2.*X) + 0.3*(rand(size(X))-0.5);
p0 = [1 1 1]; % パラメータの初期値 p0 = [a b c] 適当な初期値1に設定
p = fminsearch(@(p)fun(p,X,Y),p0); % 最適化関数値が最小となるパラメータa,b,cを求める
Ysim = p(1) + p(2).* exp(-p(3).* X); % 求められた最適化関数の出力を求める
plot(X,Y,'o',X,Ysim) % 測定点(青色のo点)と最適化関数(橙色の直線)をプロットする
end
function obj = fun(p,X,Y) % 最適化関数
Ysim = p(1) + p(2).* exp(-p(3).* X) % 測定点の指数関数a + b * exp(-cx)を定義
obj = (Y - Ysim).' * (Y - Ysim) % 測定点と近似点の誤差の二乗平方和を計算
end

5 件のコメント

美音 奥居
美音 奥居 2021 年 5 月 29 日
大変勉強になりました。MATLABを昨日使い始めたもので、あらゆるコードの意味がわからず困っておりましたので、ご丁寧な回答を頂き、厚くお礼申し上げます。
Hiroki Takeda
Hiroki Takeda 2022 年 5 月 17 日
こちらのデータフィッティングを、私も実際にやってみたいと思っています。
データはxにサイズ、yに度数の、ヒストグラムのようなものです(barで描いています)。このヒストグラムにデータフィッティングするものを描きたいと思っています。
ただ、エラーとして以下のようなものが出てきてしまします。
---
「このコンテキストでは関数定義がサポートされません。関数はコード ファイル内でローカル関数または入れ子関数としてのみ作成できます。」
---
コードは以下です。Hx(1× 50,double、Hx=0:0.1:4.9)、Hy(50×1,double、Probability Density)です
function main
p0 = [1 1 1]; % パラメータの初期値 p0 = [a b c] 適当な初期値1に設定
p = fminsearch(@(p)fun(p,Hx,Hy),p0); % 最適化関数値が最小となるパラメータa,b,cを求める
Ysim = p(1) + p(2).* exp(-p(3).* Hx); % 求められた最適化関数の出力を求める
plot(Hx,Hy,'o',Hx,Ysim) % 測定点(青色のo点)と最適化関数(橙色の直線)をプロットする
end
function obj = fun(p,Hx,Hy) % 最適化関数
Ysim = p(1) + p(2).* exp(-p(3).* Hx) % 測定点の指数関数a + b * exp(-cx)を定義
obj = (Hy - Ysim).' * (Hy - Ysim) % 測定点と近似点の誤差の二乗平方和を計算
end
ご教示くださりますと幸いです。
よろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno 2022 年 5 月 17 日
  • スクリプトエディタまたはライブスクリプトエディタを開き、その中にプログラムを書いて実行すればエラーが解消すると思います。
  • function mainと対応するendは無くてもOKです (function obj = fun(p,Hx,Hy)は必須です)
Hiroki Takeda
Hiroki Takeda 2022 年 5 月 18 日
ご回答、ありがとうございます。すみません、私のやり方が悪いのかうまくいかないようです。
Atsushi Ueno様の元は、ライブスクリプトエディタで実行できました。私の上記のものは、実行ファイル内でできれば嬉しいです。特に知りたい数字は最適化関数値が最小となるパラメータa,b,cの、pです。これもグラフ内に記載できると幸いです。
よろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno 2022 年 5 月 18 日
CoderやCompilerが無いので確認できていませんが、functionの名前をmainとした事が問題になっているかもしれません。function mainとendの行を記述せず、fminsearch関数をHx,Hyを演算する所と同じ場所で実行すれば良いと思います。fun関数の定義はそのままにすべきです。
関数を分割する必要も入れ子にする必要もありません。
当時の自分がなぜ”function main”を定義したのか覚えていません。
混乱を与えてしまい申し訳ありません。

サインインしてコメントする。

その他の回答 (0 件)

製品

リリース

R2021a

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!