- ベストアンサー
両辺にyを含んだexpの式をグラフ化したいのですが
y=A*(exp((x-y*B)/C)-1)+(x-y*B)/D 上記の式で、定数A,B,C,Dを任意に設定して エクセル上(絶対にエクセルである必要はないんですが)で x-yのグラフを描きたいです。 expの中にyが入っているため、 y=f(x) の形に変形することができません。 よってグラフ化できず、困っています。 A~Dの任意定数と変数xの大まかな範囲は以下の通りです。 A:10^(-10) ~ 10^(-7) B:10 ~ 200 C:0.02 ~ 0.2 D:10^5 ~ 10^7 x:0 ~ 2 A~Dの任意定数を変化させたときの、 グラフの変化の傾向が知りたいです。 よってyは厳密な解である必要はなく、近似値で構いません。 質問は以上です。 何卒力を貸して下さい。よろしくお願いします。 以下、参考になるかわかりませんが、 問題の式がどこから出てきたかの説明です。 現在、ショットキー型ダイオードの特性評価をしており、 サンプルとなるダイオードを以下に示す回路図でモデル化しました。 ダイオード ↓ ┌──>l──┐ │ │ │ │ ──/\/\/──┤ ├──── │ │ │ │ └/\/\/-┘ 直列抵抗R1↑ 並列抵抗R2↑ (フォントが崩れてないといいんですが・・・見づらくてすいません) 測定対象のダイオードに対して、 直列および並列に抵抗が入っていると考えます。 直列抵抗:ダイオードを形成する各材料による抵抗成分(接触抵抗など) 並列抵抗:ショットキー接合における欠陥によるリーク成分 (低電圧時はR2を通って電流が流れてしまうと考えます) この回路に電圧Vを印加したときに流れる電流Iは I=I0*(exp(q*(V-I*R1)/nkT)-1)+(V-I*R1)/R2 I0:逆方向飽和電流 q:電気素量 n:ダイオードの電気特性を示すnパラメータ k:ボルツマン定数 T:ケルビン温度(ここでは室温:T=300としています) と定義されます。 最初に示した問題の式は I→y V→x I0→A R1→B nkT/q→C R2→D と置き換えを行ったものです。 実際にサンプルを測定して得られたVとIのデータがあり、 そのデータに対してフィッティングをかけて、 A~Dのどのパラメータが支配的なのかを探すことが目的です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ANo.2です。 プログラムを修正します(1行追加)。こちらを貼り付けてください。 Function fnc1(A As Double, B As Double, C As Double, D As Double, x As Double) As Double ' If x = 0 Then fnc1 = 0 Exit Function End If ' Dim xmin As Double, ymax As Double Dim y As Double, y1 As Double, y2 As Double Dim s As Double, s1 As Double, s2 As Double, eps As Double ' xmin = -10 ' xの最小値 [V] ymax = 10 ' yの最大値 [A] eps = 10 ^ (-10) ' 収束判定 ' y1 = (xmin / D - A) / (1 + B / D) y2 = ymax s1 = A * (Exp((x - B * y1) / C) - 1) + (x - B * y1) / D - y1 s2 = A * (Exp((x - B * y2) / C) - 1) + (x - B * y2) / D - y2 ' While Abs((y1 - y2) / y2) > eps y = (y1 + y2) / 2 s = A * (Exp((x - B * y) / C) - 1) + (x - B * y) / D - y If Sgn(s1 * s) < 0 Then y2 = y Else y1 = y s1 = A * (Exp((x - B * y) / C) - 1) + (x - B * y) / D - y End If Wend fnc1 = y End Function
その他の回答 (3)
- inara1
- ベストアンサー率78% (652/834)
>無事に動作し、自分の望むグラフを得ることができました 良かったですね お察しの通り、y1 は解の下限で、このプログラムはy1 と ymax の間で解を探しています。 印加電圧が+の場合の y を計算するのであれば、解は必ず+なので y1 = 0 とすればいいです。 最初はそうしましたが、欲を出して x < 0 のときにも解を計算できるようにしたほうがいいかなと考え、y の下限を-側に拡張してみました。初め、y1 をいい加減な値(例えば -1A)としたのですが、そうすると計算途中で y がオーバフローしてしまったので、適切な下限が必要なのではと思って、その下限を考えてみました。 元の式 y = A*[ exp{ ( x - y*B )/C } -1 ] + ( x - y*B )/D はy について解析的に解けませんが、x → -∞ のとき、exp{ } → 0 となるので、逆バイアスが大きいとき、y は次式で近似できます。 y = -A + ( x - y*B )/D これは exp を含まないので y について解けて、その解は y = ( x/D - A )/ ( 1 + B/D ) となります。これを下限としたら解が収束しました。
お礼
> x < 0 のときにも解を計算できるようにしたほうがいいかなと考え そこまで考えてくださっていたのですか。ありがとうございます。 疑問だった式の意味、よくわかりました。 プログラムだけでなく、マクロの設定の仕方から丁寧に 教えてくださり、助かりました。 お世話になりました。ありがとうございました。
- inara1
- ベストアンサー率78% (652/834)
Excelのマクロで y を計算する方法を以下に紹介します。 セルに = func1(A,B,C,D,x) と書けば y(電流)を計算してくれます。 x(電圧)がマイナスでも計算できます(デフォルトは-10Vまで)。 y の相対精度は10^(-10)です(変更可)。動作確認済みです。 (1) Excelシートのメニューの[ツール] → [マクロ] → [Visual Basic Editor] (2) Visual Vasic Editorのメニューの[挿入] → [標準モジュール] (3) 出てきた空白画面に以下の文を貼り付ける ↓ここから Function fnc1(A As Double, B As Double, C As Double, D As Double, x As Double) As Double ' If x = 0 Then fnc1 = 0 Exit Function End If ' Dim xmin As Double, ymax As Double Dim y As Double, y1 As Double, y2 As Double Dim s As Double, s1 As Double, s2 As Double, eps As Double ' xmin = -10 ' xの最小値 [V] ymax = 10 ' yの最大値 [A] eps = 10 ^ (-10) ' 収束判定 ' y1 = (xmin / D - A) / (1 + B / D) y2 = ymax s1 = A * (Exp((x - B * y1) / C) - 1) + (x - B * y1) / D - y1 s2 = A * (Exp((x - B * y2) / C) - 1) + (x - B * y2) / D - y2 ' While Abs((y1 - y2) / y2) > eps y = (y1 + y2) / 2 s = A * (Exp((x - B * y) / C) - 1) + (x - B * y) / D - y If Sgn(s1 * s) < 0 Then y2 = y Else y1 = y End If Wend fnc1 = y End Function ↑ここまで (4) その画面を閉じるか、Visual Vasic Editorのメニューの[ファイル] → [終了して Microsoft Excelへ戻る] (5) ユーザー定義関数 func1(A,B,C,D,x) として使用する 最初、逐次近似法で計算してみましたが、x が大きくなると解が振動してしまいました。これは2分法で y の値を探す方法です。この電流-電圧特性は単調増加なので解は1つしかありません。
- haniwannko
- ベストアンサー率55% (16/29)
はじめまして。 GRAPESというWindowsで動くフリーソフトがあります。 うざったいインストールもいらないという便利な品です。 これを使って、陰関数で定義すると、 y=exp(y-x) y=exp((y-x)/5) のような式もグラフ化できます。 質問者様のような複雑な式はどうかわかりませんが、一度お試しになられてみてはいかがでしょうか。 GRAPES http://www.osaka-kyoiku.ac.jp/~tomodak/grapes/
お礼
返事が遅くなってしまい、申し訳ありませんでした。 早速のご回答、ありがとうございます。 すいません。質問の記入欄でひとつ大事なことを書き忘れてました。 グラフはy軸をログスケールにした片対数グラフで評価しています。 yの値が10^(-10)~10^(-2)と幅広いためです。 >GRAPESというWindowsで動くフリーソフトがあります。 このようなフリーソフトがあるとは知りませんでした。 上記の通り片対数でグラフを表示したいです。 早速このソフトを使ってみましたが、片対数に設定できない (マニュアルは一応目は通したんですが・・・) ため、今回の件では使えませんでした。 ですが、とても便利なソフトを紹介していただき、 ありがとうございました。 このソフト、他の機会で活躍の場がありそうです。
補足
返事が遅くなってしまい、申し訳ありませんでした。 とても親切な回答をしていただいてありがとうございます。 inara1様のプログラムを使わせていただいたところ、 無事に動作し、自分の望むグラフを得ることができました。 もしよろしければ、このマクロの中身について 教えていただけないでしょうか? >y1 = (xmin / D - A) / (1 + B / D) の部分です。 2分法の計算を行う際の、スタートとなる2点のうちの小さい方を 定義しているのだと思うのですが、なぜこのような形で 定義されているのかがわかりません。