計測データの2変数(X、Y)から、一つの値Z(X,Y)が決まる関数の近似曲線を作りたいのですが、方法(ツール)を教えて頂けないでしょうか?有料ソフトでも構いません。
「これを使えば出来るのでは?」ではなく、実際にした事があり「これを使えば出来た」という情報が嬉しいです。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

ANo.5 のstomachmanです。


 B,つまりfittingをやりたいということですね。
 測定を行った点を(Xj, Yj)とし、そこでの測定値をMjとします。(j=1,2,…, J)

 さて、モデルとして、例えば多項式
Z(X,Y) = a[1]+a[2]X+a[3]Y+a[4]XY
を考えているとしましょう。X,Yに具体的に測定点の座標(Xk, Yk)を代入した式
Z(Xj, Yj) = a[1]+a[2]Xj+a[3]Yj+a[4]XjYj
は、未知数a[1]~a[4]を含んでいます。一方、1, Xj, Yj, XjYj はいずれも定数です。だから、右辺は変数a[1]~a[4]の一次式になっています。

ここで、変数の個数よりも測定点の個数Jの方が多いことが必要です。

 測定値とのずれεjをj=1,2,…, J について
εj = Z(Xj, Yj) - Mj
と定義します。そして、それらの二乗和
E = Σ(εj ^2)    (Σはj=1,2,…,Jについての和。以下同様)
を最小にするようなa[1]~a[4]を決定することを考えます。そのようなa[1]~a[4]は
∂E/∂a[n] = 0  (n=1,2,…,4)
という連立方程式を解くことによって得られます。
さて、
∂E/∂a[n]
=(∂/∂a[n]) Σ(εj ^2)
= Σ(∂/∂a[n]) (εj ^2)
= 2Σεj (∂εj /∂a[n])
= 2Σ((Z(Xj, Yj) - Mj)(∂Z(Xj, Yj) /∂a[n]))
であり、たとえば
∂Z(Xj, Yj) /∂a[4] = (XjYj)
です。
従って、
2Σ(Z(Xj, Yj) - Mj)=0
2Σ(Z(Xj, Yj) - Mj)Xj=0
2Σ(Z(Xj, Yj) - Mj)Yj=0
2Σ(Z(Xj, Yj) - Mj)(XjYj)=0
という式ができ、これをさらに展開して整理すると、
a[1]Σ1+a[2]ΣXj+a[3]ΣYj+a[4]ΣXjYj=ΣMj
a[1]ΣXj+a[2]Σ(Xj^2)+a[3]Σ(XjYj)+a[4]Σ((Xj^2)Yj)=Σ(XjMj)
a[1]ΣYj+a[2]Σ(XjYj)+a[3]Σ(Yj^2)+a[4]Σ(Xj(Yj^2))=Σ(YjMj)
a[1]Σ(XjYj)+a[2]Σ((Xj^2)Yj)+a[3]Σ(Xj(Yj^2))+a[4]Σ((Xj^2)(Yj^2))=Σ(XjYjMj)
という連立方程式になります。
これを行列で表せば、ANo.1のように逆行列を使ってa[1]~a[4]が計算できる訳です。

 最初から行列を使うと、もうちょっとスマートに表せます:
J行4列の行列P[j,n] (j=1,2,…,J; n=1,2,3,4)を
P[j,1]=1
P[j,2]=Xj
P[j,3]=Yj
P[j,4]=XjYj
とし、縦ベクトルm を
m[j] = Mj
とすると、上記の連立方程式は
(P' P)a = P'm
と書けます。(ここに ' は転置行列を表します。)なので、
a = (P' P)* (P'm)
です。(ただし ()* は逆行列を表します。)
Excelの関数で言えば、
(P' P)* P'm

=MMULT(MINVERSE(MMULT(TRANSPOSE("P"), "P")), MMULT(TRANSPOSE("P"),"m"))
ですね。

 このサイトで「最小二乗法 MINVERSE」というキーワードで検索すれば、他にも参考になる情報が見つかるでしょう。
    • good
    • 3

「近似」と仰る意味によって話が違います。



A: とびとびの(X,Y)における「計測データ」しかないので、計測しなかった(X,Y)における値をソレナリに推定したい。
B: 理論的にZ(X,Y)の関数の形が分かっているが、未知の係数を幾つか含んでいる。「計測データ」に含まれる誤差の影響を除いて、この関数の係数を決めたい。

どちらでしょうか。Aの場合は補間法(内挿法, interpolation)を使い、Bの場合はフィッティング(当てはめ, fitting)を行います。

いずれにしても、曲面がどんな種類の関数であるか(これをモデルと言う)を決めておいて、そのパラメータ(係数)を計算するというやり方をします。

A: 補間法で、(X,Y)が格子点になっている場合によく使われるのは、双n次多項式補間(ラグランジュ補間)です。たとえば双3次補間では、Xについて3次式、Yについても3次式であるような多項式
Z(X,Y) = (a[3,3] X^3 + a[2,3] X^2 + a[1,3] X + a[0,3])Y^3 + (a[3,2] X^3 + a[2,2] X^2 + a[1,2] X + a[0,2]) Y^2 + (a[3,1] X^3 + a[2,1] X^2 + a[1,1] X + a[0,1])Y +(a[3,0] X^3 + a[2,0] X^2 + a[1,0] X + a[0,0])
を使って、4個の格子点(計測点)を四隅とする矩形の内部での値を計算します。この式の16個の係数a[3,3], a[3,2], …は、前記の矩形を囲む4×4個の格子点での測定値を使って計算します。すなわち、曲面Zがこれら16個の格子点において測定値と一致するように係数を決めるのです。(上記の式は未知の係数a[0,0], a[0,1], …について1次式になっていますから、連立1次方程式の問題であり、簡単です。)格子点4個で囲まれる矩形ひとつずつについて、16個の係数を計算することになります。
 最も簡単なのは双1次補間で、格子点4個で囲まれる矩形の内部を、四隅の4個の格子点での計測値だけで決まる係数で表します。すなわち、
Z(X,Y) = (a[1,1] X + a[0,1])Y +(a[1,0] X + a[0,0])
です。(実用上、これで十分であるような場合も多々あります。)
 なお、測定点が格子になっていない場合には、スプライン補間が使えます。(幾つもバリエーションがありますが。)

B: フィッティングにおいては、全ての計測値を使ってひとつの式Z(X,Y)の係数を決めます。そうして決めた曲面Z(X,Y)は、各測定点(X,Y)に於ける測定値と必ずしも一致しません。このずれは、測定値の方に誤差がある、と考えるのです。
 フィッティングにはANo.1にある最小二乗法を使うのが普通です。特にモデルが多項式
Z(X,Y) = a[0,0]+a[1,0]X+a[0,1]Y+a[1,1]XY+a[2,0](X^2)+a[0,2](Y^2)+…
であるとき、未知の係数a[0,0], a[0,1], …を決める訳ですが、この式は(変数の数や次数が幾つだろうと関係なく)a[0,0], a[0,1], …について1次式になっていますから、線形最小二乗法で簡単に計算できます。
 なお、各測定点における測定誤差のばらつきが分かっている場合には、重み付き線形最小二乗法を使うのが適切です。

 という訳で、どういうツールを使うか以前に、何をやりたいかをはっきりさせる必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ご丁寧にご説明いただきありがとうございました。
私が知りたいのは後者の方です。
簡便に使えるツールとして使いたいと思っております。
よろしくお願いします。

お礼日時:2007/10/29 12:42

x,yはランダムなデータ列でしょうか


規則的なデータ列でしょうか
(格子点とか)
=xが同じデータをとりだせるか
    • good
    • 0

2変数(X、Y)からは


近似曲線
はもとまりません。
求まるのは近似曲面です。

この回答への補足

回答ありがとうございます。
補足します。
おっしゃる通り曲面です(^^;)。うっかりしてました。
曲面の近似式を決定したいのです。

補足日時:2007/10/27 14:09
    • good
    • 0

エクセルでできるよ。



グラフ作った後、グラフをクリックして「近似曲線の追加」ね。式も出せるよ。
    • good
    • 1

2変数(x,y)のデータが n個あるとき、y=ax+b などの未定係数 a,b を求めるのに最小二乗法があり、



|a| |Σx^2 Σx|-1| Σy|   -1 は逆マトリックスを表す。
| |=|     |  |  |
|b| | Σx    n |     |Σxy|

より、求められます。もちろん、y=ax^2+bx+c などの2次式、3次式にも拡張できます。

この回答への補足

回答ありがとうございます。
1変数XからF(X)を決めるのではなく、2変数(X,Y)からF(X,Y)を決めたいのですが。。。
よろしくお願いします。

補足日時:2007/10/27 14:14
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q文字列型の一般的な変数名は?

おはようございます。

サンプルコードで
数値型の変数名は
Dim i As Long
のようにiをよく見かけます。

ただ、私が勉強不足のため
文字列型の変数名の一般的な文字に何が使われているのかわかりません。
(str?moji?など?)

サンプルコードを書くときに使用する
文字列型の変数名を教えてください!

Aベストアンサー

こんにちは。私の場合は自己流ですが、ネットなど見て他の方を
参考にして今日に至っています。

ルールは簡単で変数に何を(何の型)格納するかによって変えています。
・長整数の数字を格納する場合:Dim lngXXX as Long
・文字列を格納する場合:Dim strXXX as String
・ワークシートを格納する場合:Dim Wsh as WorkSheet

などです。「変数の型」を「変数の名前」に使います。
これで時間が経過した後にプログラムを読み返した時に
思い出しの助けとなります。
「XXX」の部分も同様で変数を使う目的の名前を含ませると、
後で読んだときにさらに助けになると思います。
例えばString型で何からの「名前」を格納するときには
Dim strName as String
などXXX→Nameとすると可読性が上がると思います。
他の方の回答でもあるように日本語の変数は使わないように
しています。

なお、変数名でアルファベット大文字、小文字混在を使うことで
変数を入力時にすべて小文字で入力したときに変数を打ち間違えていると
気づきやすくなりこれも小さい便利です。

こんにちは。私の場合は自己流ですが、ネットなど見て他の方を
参考にして今日に至っています。

ルールは簡単で変数に何を(何の型)格納するかによって変えています。
・長整数の数字を格納する場合:Dim lngXXX as Long
・文字列を格納する場合:Dim strXXX as String
・ワークシートを格納する場合:Dim Wsh as WorkSheet

などです。「変数の型」を「変数の名前」に使います。
これで時間が経過した後にプログラムを読み返した時に
思い出しの助けとなります。
「XXX」の部分も同様で変数を使う目的...続きを読む

Qx*y=log(e^x+e^y)と定義すると、(x*y)+z=(x+z)*(y+z)

x、y∈Rに対して
x*y=log(e^x+e^y)
と定義すると、
(x*y)+z=(x+z)*(y+z)
が成り立ちます。
分配法則の*と+を逆にしたような感じですが、この*から何かしらの代数的な事実が従うのでしょうか?
この*の意味は何なのでしょうか?

x*x=aのとき、x=√aと定めと、
√(a*b)≧(a+b)/2
といった相加相乗平均の関係の類似は成り立つようですが。

Aベストアンサー

e^x=X, e^y=Y, e^z=Z と置いて考えましょう。
e^(x*y)=e^x+e^y → Z=X+Y
e^(x+y)=e^x*e^y → Z=X*Y
つまり、正の数の加算と乗算になります。

>分配法則の*と+を逆にしたような感じですが

まさにその通りです。入れ替えて見てください。

>√(a*b)≧(a+b)/2

通常の相加相乗平均とは逆ですね。

Q【Java】参照型で宣言された変数名の抽出

現在、Javaを学習中の大学生です。

Javaのソースコードを解析し、その中で宣言されている変数名を抽出して、
変数表のようなものを作成するJavaプログラムを書いているのですが、
参照型(クラス型)で宣言されている変数名を抽出する方法が思いつきません。
よろしければ、何かアイディアをいただけないでしょうか。

プリミティブ型の変数については、StreamTokenizerクラスを利用しています。
コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
するという、単純な方法を使っています。こちらも、改良すべき点などあれば、
アドバイスいただけるとありがたいです。

デバッガを使えば出来ないことはないようですが、
出来ればデバッガは使わない方法でお願いします。

Aベストアンサー

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
でしなければならない事の概要としては間違っていないと思いますが、
実装の上ではjavaがフリーフォーマットである事に注意して下さい。
型名の途中にホワイトスペースが挟まる事はありませんが、配列の場合こんな書き方も出来ますので。

int a
[
];

また、その際にローカル変数を抽出の対象にしないのであれば、
更に宣言スコープ等を考慮する必要が出てきますし、
これに内部クラスや匿名クラスのフィールドも混ざってくると非常にややこしい事になると思いますが、不可能ではありません。
がんばってください。

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークン...続きを読む

Q複数の点(x,y)を通る曲線を,指数関数(y = a^x + c)ので近似するときの計算方法

初歩的な質問ですみません.

複数の点(x, y)の近くを通る指数関数(y = a^x + c)を,
近似で出したいとき,指数aや定数cの求め方についてです.

■前提条件
・y = f(x) = a^x + c とする (a:指数,c:定数)
・座標1 (x1,y1)=(50,5)の近くを通って欲しい
・座標2 (x2,y2)=(1000,30)の近くを通って欲しい

■解法の糸口(自分でやってみたこと)
・y=a^x は,a=y^(1/x),またx=log_a(y) ともかけるので,

1.とりあえずcは無視して,座標1を代入すると,
  5=a^50 ⇔ a=5^(1/50)=1.032712419896443
2.座標2を代入すると,
  30=a^1000 ⇔ a=30^(1/1000)=1.0034069880166463
3.1.と2.の答えが違っているため,どちらをどう使っていいかわからない
  しかも,まだcは考慮できていない.

Webでも調べたりして,いろいろ試行錯誤したのですが,
頭が混乱してきて,お手上げ状態になってしましました….

よろしければ,導出方法を計算過程を記して教えていただけると嬉しいです.
必要に応じて,関数電卓をお使いください.
※a^bを計算するときは,pow(a,b)と入れないと正しい答えを返しませんのでご注意ください.
http://tomari.org/main/java/dentaku_kansuu.html

※ちなみに,指数関数y=a^x+cは,座標が最低何個わかればaとcが求まるのでしょうか? 
未知の変数の数は2個(aとc)なので,2個あれば確定するのでしょうか.
N個の近似となると別に確定する必要はないのですが,知っておかないといけない情報かもしれません.
ちなみに,これまで関数近似については,最小二乗法(直線の近似)以外,
高校以来,あまり勉強したことはありません.
(つまり,指数関数の本質,数学的な知識は乏しいです….)

以上です,よろしくお願いいたします.

初歩的な質問ですみません.

複数の点(x, y)の近くを通る指数関数(y = a^x + c)を,
近似で出したいとき,指数aや定数cの求め方についてです.

■前提条件
・y = f(x) = a^x + c とする (a:指数,c:定数)
・座標1 (x1,y1)=(50,5)の近くを通って欲しい
・座標2 (x2,y2)=(1000,30)の近くを通って欲しい

■解法の糸口(自分でやってみたこと)
・y=a^x は,a=y^(1/x),またx=log_a(y) ともかけるので,

1.とりあえずcは無視して,座標1を代入すると,
  5=a^50 ⇔ a=5^(1/50)=1.032712419...続きを読む

Aベストアンサー

補足(1)
a^50(a^950-1)-25 = 0
を解けばいいですが、
excelでやるなら、ソルバーの機能を使えばいいでしょう。
正直、私はexcelには詳しくないので
「excel ソルバー」とかで検索してみるといいと思います。

補足(2)
普通は最小二乗法を使います。excelでやるならこれもソルバーでできます。
http://homepage1.nifty.com/gfk/square_solver.htm
に、N次関数で近似する例が載っていますが、指数関数で近似する場合も同様にできます。

QC言語のfloat型変数の値代入と表示について

float型変数の値代入と表示について質問があります。

#include <stdio.h>

int main(void)
{
 float flVal = 50.456;
 printf("float型変数:%f", flVal);
 return 0;
}

上記を実行すると、「float型変数:50.456001」と表示されました。
また、float flVal = 50.1; と変えて実行すると、「float型変数:50.099998」と表示されました。

それぞれ期待していた結果は、
「float型変数:50.456000」、「float型変数:50.100000」だったのですが
代入した値と結果が微妙に異なる理由は何でしょうか。よろしくお願いします。

Aベストアンサー

IBMのページから
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729933
基本的に小数点以下の数値を含むものは(0.5,0.25、0.125などを除き)、誤差が生じるため。

実際の浮動小数点演算プログラムでは、許容できる範囲であれば一致しているとみなして処理を行うことが多い。

irb(rubyの対話型インタプリタ)やpythonのプロンプトで
irb> 0.1 +0.2 == 0.3 (Enter) とすると
falseが返る。

金額計算などでは単位未満(日本での銭単位とか)を扱う場合はこれでは困るので、小数点以下でも有効桁数内では誤差が生じない固定小数点型が用いられる。

COBOLが何のかんのと言われながら、勘定系取引でシェアが高かったのも基本が固定小数点型を採用していた事が大きい

SQLでも整数型、浮動小数点型、固定小数点型みんなあります。
(Oracleは長いこと、固定小数点型で全部こなしてましたが)

JavaではBigDecimalクラスが固定小数点です。ただ、Java演算子のオーバーロードが出来ないので、いちいちadd、sub、multiply、divideメソッドを使わなければならないのがちょっと面倒。

.Net Framwork( VB.NET、C# )のdecimalクラスの方が直感的かもしれない。

ちなみにrubyにもあります。
http://www.ruby-lang.org/ja/man/html/BigDecimal.html

IBMのページから
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729933
基本的に小数点以下の数値を含むものは(0.5,0.25、0.125などを除き)、誤差が生じるため。

実際の浮動小数点演算プログラムでは、許容できる範囲であれば一致しているとみなして処理を行うことが多い。

irb(rubyの対話型インタプリタ)やpythonのプロンプトで
irb> 0.1 +0.2 == 0.3 (Enter) とすると
falseが返る。

金額計算などでは単位未満(日本での銭単位とか)を扱う場合はこれでは困るので、小数点以下でも...続きを読む

Q線形です (1)を x+3y-2z=0 x-2y+4z=0 x^2+y^2+z^2=1をもちいて 答

線形です
(1)を
x+3y-2z=0
x-2y+4z=0
x^2+y^2+z^2=1をもちいて
答えが+-の答えになりました
(2)では外せきが8,-6,-5となり
おおきさの5ルート5で割ると
+-の答えにはなりませんでした
どちらが正しいのでしょうか?

Aベストアンサー

外積からでてきた単位べクトルは、外積の定義から、ベクトルa、bに垂直ですよね。
だからそれと正反対のベクトルも、ベクトルa、bに垂直な単位ベクトルだから、これも答えに入れれば
よいのです。つまり外積から出した単位ベクトルの各成分に(-1)をかけた成分のベクトルも答えに
なります。そしてこうして出した2つのベクトルは、先に内積で出した2つのベクトルと一致します。

Q 日付型なら変数の先頭になんてつけてますか?

変数名で、
文字列型なら
Dim str組織名 As String
数値型なら
Dim intNo As Long
としてるのですが、
日付型なら変数の先頭になんてつけてますか?

Dim date月日 As Date
にしようかなと思ったのですが
なんかくどいかなって感じます。

Aベストアンサー

 ご質問のカテゴリが [デジタルライフ] - [ソフトウェア] - [Office系ソフト] ですので「VBA(Visual Basic for Applications)」でのお話しとして回答いたします。

 Office 系の解説で有名な「インストラクターのネタ帳」に
●変数のプレフィックス一覧
http://www.relief.jp/itnote/archives/001268.php
というページがありますが、ここに、

'-- ここから引用------------------------------------------------------
対象:Visual Basic for Applications

変数名にデータ型がわかるようなプレフィックス(プリフィックス)をつける記述スタイルがありますが、どのデータ型のときにどんなプレフィックスをつけるか、Microsoftのサイトを元に一覧にまとめておきます。
'-- ここまで引用------------------------------------------------------
として、
データ型/プレフィックス/変数の例
文字列型 (String)/str/strFName
日付型 (Date)/dtm/dtmStart
のように掲載されています。

 ちなみに、上記ページにある論拠としての「Microsoftのサイト」ですが、リンク切れになっておりますので、こちらをご覧ください。
http://web.archive.org/web/20050309034601/http://www.microsoft.com/japan/developer/library/VBCon98/vbconconstantvariablenamingconventions.htm

 ご質問のカテゴリが [デジタルライフ] - [ソフトウェア] - [Office系ソフト] ですので「VBA(Visual Basic for Applications)」でのお話しとして回答いたします。

 Office 系の解説で有名な「インストラクターのネタ帳」に
●変数のプレフィックス一覧
http://www.relief.jp/itnote/archives/001268.php
というページがありますが、ここに、

'-- ここから引用------------------------------------------------------
対象:Visual Basic for Applications

変数名にデータ型がわかるようなプレフィックス...続きを読む

Q多変数関数f(x,y)の多変数関数g(x,y)による微分∂f/∂gを計

多変数関数f(x,y)の多変数関数g(x,y)による微分∂f/∂gを計算するには?

xとyに関する多変数関数f(x,y)と、g(x,y)が与えられたとき、微分∂f/∂gを計算するにはどうしたらよいでしょうか?(そもそも偏微分なのだろうか?)

具体例で考えます。

f(x,y) = (x+2y)^2
g(x,y) = x+2y

である場合。当然∂f/∂g = 2 gです。このような場合は問題ありませんが、

f(x,y) = x + 3y
g(x,y) = x + 2y

のような場合はどのように考えたらよいのでしょうか?

全微分の関係を使って考えてみました。

df(x,y) = (∂f/∂x) dx + (∂f/∂y) dy + O(dx,dy)
= dx + 3 dy + O(dx,dy)

dg(x,y) = (∂g/∂x) dx + (∂g/∂y) dy + O(dx,dy)
= dx + 2 dy + O(dx,dy)

∂f/∂g = limit_{dx→0,dy→0} df/dg を考えれば良いのではないかと。

どの方向から極限をとっても極限値が変わらないと仮定して、
つまりdx = dyとして、極限を考えると。

∂f/∂g = 4/3

とても正しいとは思えないのですが、他にどう考えればよいのかわからず悩んでいます。
そもそも、微分が存在しないと言うことなのでしょうか?

質問は以下の2点です。
(1)この様な場合、どのように考えていけばいいのでしょうか?
(2)この様な微分に関して、数学的に何か名前があるのでしょうか?分野名など。

以上
よろしくお願いします。

多変数関数f(x,y)の多変数関数g(x,y)による微分∂f/∂gを計算するには?

xとyに関する多変数関数f(x,y)と、g(x,y)が与えられたとき、微分∂f/∂gを計算するにはどうしたらよいでしょうか?(そもそも偏微分なのだろうか?)

具体例で考えます。

f(x,y) = (x+2y)^2
g(x,y) = x+2y

である場合。当然∂f/∂g = 2 gです。このような場合は問題ありませんが、

f(x,y) = x + 3y
g(x,y) = x + 2y

のような場合はどのように考えたらよいのでしょうか?

全微分の関係を使って考えてみました。

df(x,y) = (∂f/∂x) dx + (∂f/∂...続きを読む

Aベストアンサー

#2です。

A#2の補足に関連して

偏微分の定義に帰って考えれば理解しやすいかと思います。

∂f/∂gを考える場合
g=x+2y=uとしてuを1つの変数として考え、偏微分ですからf=x+3yをuとu以外の他の変数vを使って f(x,y)→f(u,v)の様に表現しないといけません。
そしてuで偏微分するときはv=ー定(定数)として扱わないといけません。
A#2では 
u=x+2y,v=yという変数変換を使い、∂f/∂⇔∂(u+v)/∂uで定義しています。
g=x+2y=uと1つの変数で置き換えx+2yは一固まりとして扱わないといけません。
このとき f=u+v, v=yと書けますので、他の一定とみなすべき変数vはyに相当します。
v=y=一定とした時
∂f/∂g=∂(u+v)/∂u=1 (v=y=一定の元で偏微分が存在し定義される)
となります。

また、A#2の補足の疑問点の場合には
g=x+2y=u,f=u+u/2-x/2=(3/2)u-vと変形できるので
u=x+2y,v=x/2という変数変換を使い、∂f/∂g⇔∂((3/2)u-v)/∂uで定義しています。
この偏微分では、
v=x/2=一定とした時
∂f/∂g⇔∂((3/2)u-v)/∂u=3/2 (v=x/2=一定の元で偏微分が存在し定義される)
となります。

偏微分の変数u,vの定義(変数変換)が異なれば、その変数で定義される
∂f/∂g=∂f(u,v)/∂u
のf(u,v)が異なってきますので偏微分も異なってくるのは当然のことです。

元の独立変数x,yに戻って考えれば、yを一定にして∂f/∂gを考えるか、
xを一定にして∂f/∂gを考えるか、といった立場の違いにより、偏導関数も
異なってくるということですね。

#2です。

A#2の補足に関連して

偏微分の定義に帰って考えれば理解しやすいかと思います。

∂f/∂gを考える場合
g=x+2y=uとしてuを1つの変数として考え、偏微分ですからf=x+3yをuとu以外の他の変数vを使って f(x,y)→f(u,v)の様に表現しないといけません。
そしてuで偏微分するときはv=ー定(定数)として扱わないといけません。
A#2では 
u=x+2y,v=yという変数変換を使い、∂f/∂⇔∂(u+v)/∂uで定義しています。
g=x+2y=uと1つの変数で置き換えx+2yは一固まりとして扱わないといけません。
このとき f=u+v, v=yと書...続きを読む

Q変数の型を定義しなかった場合どうなりますか?

現在、VBAを使ってプログラミングを行っているところなのですが、
一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、このように型を定義しなくとも使うことが出来ます。もし定義しなかった場合、その変数の型は何に設定されているのでしょうか?
では型を定義するメリット及び、せずに使った場合のデメリットは何なのでしょうか?

私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

Aベストアンサー

こんばんは。

>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、

もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。

変数を使う時の問題点をあえて書かせていただきます。

私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るようになります。入門レベルでは、宣言するというのは、入力間違いを減らすために、モジュールの先頭に、Option Explicit と入れ、プロシージャ内で単に Dim 〇〇 とすればよいです。

データ型が決められていないなら、データ型の宣言しないほうが分かりやすいはずです。無理に入れたところで、初心者は、どうしてエラーが発生したか分かりません。それは、扱うデータ型のサイズなどが分からないからです。

VBAの変数のデータ型には、ほとんど、それしかないというものがあるのですが、そういう変数が分かるようになるまでは、しばらくは、テキストを参考にしたり、自分でトライアンドエラーを繰り返し、VBEditor のローカルウィンドウを確認しながら入れてもらうしかありません。ローカルウィンドウには、Variant/Long とか、本来のデータ型が出てきます。

私は、そういう話は、決まりきったことであっても、説明するのは面倒だと思うことが多いです。私は、あまり入門者に対しては教えることはしませんが、分からなければ、あえて使わなくてもよいと言います。

今のPCのスペックで、変数を宣言しないからといって、言うほどの大きな違いがあるとは思えません。Variant 型やString 型は、2Gまでの余裕があるのですが、VBAでは、それ以前に、アプリケーションがVBAに割付されたメモリの制限があり、そこでトラブってきてしまいます。まず、変数自体で、どうこうなるとは思えないです。

本格的には使いこなしは、建前論ではなく、本来、明示的に入れないと意味がありません。

主に、丸め誤差に対してデータ型のゆらぎが発生します。
'-------------------------------------------
'計算結果はどれも 0 となるはずです

Sub Sample1()
  Dim dbl_A As Double
  Dim sng_B As Single
  Dim cur_C As Currency
  Dim var_D As Variant
'リテラル値は変数型に影響を受けます。
'Variant型にしておいて、リテラル値に型宣言文字を使用するのは関心しません。
  dbl_A = 0.5 - 0.4 - 0.1
  sng_B = 0.5 - 0.4 - 0.1
  cur_C = 0.5 - 0.4 - 0.1
  var_D = 0.5 - 0.4 - 0.1
End Sub
'-------------------------------------------

>私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

プログラミング言語自体は、ほとんどデータ型の宣言をしないといけないと思います。それだけ、前提となる敷居が高いということです。

逆に、VBAの親戚のVBScript の場合は、データ型の宣言が出来ません。それだけに、例えば、文字と数字の比較は、そのまま比較してはならないわけです。VBAの場合も本来は、If 文字 = 数字 Then という比較すること自体が間違いのはずですが、それがまかり通ってしまうのですから、そういう点でデータ型があやふやになってしまっているわけです。だから、そういうアプリケーションの便利な機能に助けられてコードが成り立っているわけですから、厳密に大きな問題にはならないと思います。

'-------------------------------------------
'VBAサンプルプログラム(本来は、間違いのはずです)

Sub Sample2()
Dim i As Long
Dim j As String
i = 1
j = "1"
If i = j Then
 MsgBox "OK"
Else
 MsgBox "different"
End If
End Sub
'-------------------------------------------

こんばんは。

>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、

もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。

変数を使う時の問題点をあえて書かせていただきます。

私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るよ...続きを読む

Q確率変数XとYはf(x,y)=cxy^2(0

宜しくお願い致します。

[Q]The random variables X and Y have a joint probability density function given by f(x,y)=cxy^2 for 0<x<y<2 and 0 elsewhere
a) Find c so that f is indeed a probability density function.
b) Find P(X<1,y>1/2).
c) Find the probability density function of X.

[問]確率変数XとYはf(x,y)=cxy^2(0<x<y<2でそれ以外は0)で与えられた同時確率密度関数を持つとする。
(a) fが本当に確率密度関数であるようなcを求めよ。
(b) P(X<1,Y>1/2)を求めよ。
(c) Xの確率密度関数を求めよ。

[(a)の解]fが本当に確率密度関数なら∫_y∫_xf(x,y)dx=1.
∫[0..2]∫[y..0]cxy^2dxdy=∫[0..2]cy^2[x^2/2]^y_0dy
=∫[0..2]cy^2(y^2/2)dy=c/2∫[0..2]y^4dy=c/2[y^5/5]^2_0
=c/2(32/5)=32c/10=1. ∴c=5/16

[(b)の解]P(X<1,Y>1/2)=∫[1/2..2]∫[0..1]5xy^2/16dxdy
=∫[1/2..2]5y^2/16[x^2/2]^1_0dy
=∫[1/2..2]5y^2/16・(1/2)dy
=5/32∫[2..1/2]y^2dy
=5/32[y^3/3]^2_1/2
=5/32[8/3-1/8/3]
=0.41

[(c)の解]f_x(X)=∫_yf(x,y)dy=∫[0..2]5xy^2/16dy
=5x/16[y^3/3]^2_0=5x/16(8/3)=5x/6

で(c)の解が間違いだったのですが正解が分かりません。
正解はどのようになりますでしょうか?

宜しくお願い致します。

[Q]The random variables X and Y have a joint probability density function given by f(x,y)=cxy^2 for 0<x<y<2 and 0 elsewhere
a) Find c so that f is indeed a probability density function.
b) Find P(X<1,y>1/2).
c) Find the probability density function of X.

[問]確率変数XとYはf(x,y)=cxy^2(0<x<y<2でそれ以外は0)で与えられた同時確率密度関数を持つとする。
(a) fが本当に確率密度関数であるようなcを求めよ。
(b) P(X<1,Y>1/2)を求めよ。
(c) Xの確率密度...
続きを読む

Aベストアンサー

うーん、前回の質問といい、なぜ前の2問ができてこれを間違うのでしょう?
発展問題というより、視点を変えただけで難易度も考え方も同じです。
今回は前回よりは勘違い度が低いのできちんと書いておきます。

f(x,y)=cxy^2(0<x<y<2でそれ以外は0)
なのですからyの積分範囲は下限x,上限2ですね。

5x/16∫[x,2]y^2dy=5x/16 * [y^3/3]^2_x=5x/48 * (8-x^3)
(=5x/6-5x^4/48)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング