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

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

 Risposta accettata

Atsushi Ueno
Atsushi Ueno il 29 Mag 2021
Modificato: Atsushi Ueno il 29 Mag 2021

0 voti

上記の公式回答がとても参考になるので、自分の目的にあった方法を探してください。
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 Commenti

美音 奥居
美音 奥居 il 29 Mag 2021
大変勉強になりました。MATLABを昨日使い始めたもので、あらゆるコードの意味がわからず困っておりましたので、ご丁寧な回答を頂き、厚くお礼申し上げます。
Hiroki Takeda
Hiroki Takeda il 17 Mag 2022
こちらのデータフィッティングを、私も実際にやってみたいと思っています。
データは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 il 17 Mag 2022
  • スクリプトエディタまたはライブスクリプトエディタを開き、その中にプログラムを書いて実行すればエラーが解消すると思います。
  • function mainと対応するendは無くてもOKです (function obj = fun(p,Hx,Hy)は必須です)
Hiroki Takeda
Hiroki Takeda il 18 Mag 2022
ご回答、ありがとうございます。すみません、私のやり方が悪いのかうまくいかないようです。
Atsushi Ueno様の元は、ライブスクリプトエディタで実行できました。私の上記のものは、実行ファイル内でできれば嬉しいです。特に知りたい数字は最適化関数値が最小となるパラメータa,b,cの、pです。これもグラフ内に記載できると幸いです。
よろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno il 18 Mag 2022
CoderやCompilerが無いので確認できていませんが、functionの名前をmainとした事が問題になっているかもしれません。function mainとendの行を記述せず、fminsearch関数をHx,Hyを演算する所と同じ場所で実行すれば良いと思います。fun関数の定義はそのままにすべきです。
関数を分割する必要も入れ子にする必要もありません。
当時の自分がなぜ”function main”を定義したのか覚えていません。
混乱を与えてしまい申し訳ありません。

Accedi per commentare.

Più risposte (0)

Prodotti

Release

R2021a

Community Treasure Hunt

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

Start Hunting!