MATLAB Answers

3次関数について

1 view (last 30 days)
Osaki
Osaki on 1 Oct 2020
Commented: Osaki on 5 Oct 2020
matlabで次の3次関数の式をプロットしたいのですが,3次関数と認識してくれません.式の書き方が間違えているのでしょうか.ご教授お願いします.
元の式:y=x(1-x)(x+q)/f(x-q) ここでのf,qの値は適宜変化していくのですが,f=1,q=10^-5としました.コードは以下のように入力しました.

  8 Comments

Show 5 older comments
Osaki
Osaki on 2 Oct 2020
追記なのですがF(x,y)=0の時,zの式として変形したものをmatlabで表記したい式です.説明が中途半端ですみません.
stozaki
stozaki on 2 Oct 2020
Osaki様
プログラムの前に、前提を整理させてください。
前回ご質問に記載されていた元の式 : z1 = (x(1-x)(x-q))/(x+q)
今回記載されていた元の式 : y = x(1-x)(x+q)/f(x-q)
前回z1と書かれていましたが、今回yとなっているのは記載ミスと捉えて一旦 z といたします。また、qの前の ± が異なっていますが、xの次数には影響無いので、一旦今回の符号の並びにいたします。(前回fは1でしたので省略)
すると、次のように整理されます。
前回ご質問に記載されていた元の式 : z = (x(1-x)(x+q))/(x-q) ・・・①
今回記載されていた元の式 : z = x(1-x)(x+q)/f(x-q) ・・・②
①②の式が明確に異なることは宜しいでしょうか?
①式は、二重括弧が使われているので、 なので、zはxの2次関数です。
②式は、括弧内は計算順が優先されますが、乗除算は前から計算するので、 となり、xの3次関数 * xの1次関数なので、xの4次関数となります。
その一方で、他アプリと同じ様なグラフを得るには、ご記載頂いた①、②とは括弧の位置が異なるのでは?と考えた次第です。
ちなみに、①式のプログラム式に、q = 0.06 を適用すると、図のようになります。
同様に、エクセルを使った場合図のようになります。
stozaki
stozaki on 2 Oct 2020
追記致します。
回答に記載しましたが、前回記載頂いた式z = (x(1-x)(x+q))/(x-q)のqの符号が今回と異なる事が一番の原因かと思います。詳細は回答確認頂けますでしょうか?

Sign in to comment.

Answers (1)

stozaki
stozaki on 2 Oct 2020
Edited: stozaki on 2 Oct 2020
Osaki 様
原因がわかりました。
分数関数の書き方について にてご質問を頂いた式において、z1=(x(1-x)(x-q))/(x+q); と定義されておりましたが、添付頂いた図の数式を解くと z = {x*(1-x)*(x+q)} / {f*(x-q)} がプログラムで実行されたい式だと思われますが、如何でしょうか?
従って、プログラムは以下のようになります。
q = 0.06;
f = 2;
x = 0:0.01:1;
z = (x.*(1-x).*(x+q))./(f.*(x-q)); % 式A
plot(x,z,'b:x');
先に頂いた式では、qの符号が異なっていたことが一番の原因ではないでしょうか?また、乗除算は括弧を何処で括るかで計算結果が変わってしまいます。今回の例題では、./がfだけを割るのか、分母全体を割るのか?が最初記載されていた式だけでは見方が分かれるとことかと思います。(当初はf=1だったので、余計にわかりにくくなっていたのかと思います)
因みに式Aと、先に示した式(以下式B)でも結果は同じになるかと思いますが、式Aのほうが計算過程やプログラムとしてわかりやすいように思います。念の為計算過程を添付いたします。(拙い手書きで申し訳ございません)
z1=x.*(1-x).*((x+q)./(2*(x-q))); % 式B
z = (x.*(1-x).*(x+q))./(f.*(x-q)); % 式A
※ この式ですが、次数は3ですが、2次関数とか3次関数というよりも、双曲線関数か何かの3次近似のように見えますね....背景わからないのですみません。

  3 Comments

Osaki
Osaki on 3 Oct 2020
親身にここまで回答に付き合ってくださいましてありがとうございます.返信が遅れてしまい,すみません.この式なのですが,おっしゃる通り双曲線のようなグラフになるのかと思います.回答者様の写真の通り,式を変形してf,qの値をそれぞれ代入していく流れになっています.回答者様のご提示頂いた式で再現できましたので,非常に感謝しております.背景としましては,化学反応の解析を研究中でして,論文を元に化学反応をグラフで表現しようという試みでmatlabで勉強中という流れです.FとQはその化学反応で変化する薬品の濃度を表しています.
ただ,実のところ問題点がもう一つございまして,そちらの式でF=1,Q=0.01の時のグラフが表現できないという点です.下の写真のように0付近でグラフがy軸に水平になるのですが,matlabでは2枚目のように表現ができないのです.質問を立て続けてしてしまい,本当に申し訳ないと思っております.よろしくお願いします.
stozaki
stozaki on 3 Oct 2020
Osaki 様
背景までご説明頂きましてありがとうございます。
追加のご質問の件、原因は "x" の刻みだと考えています。今回前提として示されていた "x" は離散値として定義されています。従って、今回の式のように、0近傍では0.01刻みでは値がサンプリングが粗いため、お示し頂いた2枚目のようなグラフになります。
x = 0:0.01:1;
0近傍では、もう少し細かな刻みで離散化する必要があります。例えば、次のような離散値を使ってみると、ご所望のグラフが表示できます。
q = 0.01;
f = 1;
x = -0.01:0.001:1; % 刻みを 0.01から0.001へ変更。開始点を-0.01としたのはx<0の区間を確認するため
z = (x.*(1-x).*(x+q))./(f.*(x-q));
plot(x,z,'b:x');
また、単に数式を連続関数としてグラフ化したいのであれば、次のようにfplotを使うことで、連続的な表示が可能です。
fplot(@(x) (x.*(1-x).*(x+q))./(f.*(x-q)),[-0.5 1],'b')
理論値(実験データに対するリファレンス)として、グラフ化したいのであれば、後者(連続的)の方が用途には合っているのかもしれません。
どちらをご利用されるかは、Osaki様のご研究の用途に応じてご検討頂ければと思います。
Osaki
Osaki on 5 Oct 2020
大変,凄く勉強になりました.今まで軽く考えていたxの刻みが直接的な原因になるとは思っていませんでした.stozaki様のおかげで思い描いていたグラフを表現することが出来ました.fplot技術については認知していたのですが,教えていただいて改めて有用性に気づきました.ここまで長い間,質問に答えてくださってありがとうございました!本当に感謝しています!

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!