i 個の測定点 (x[i],y[i]) を,最小二乗法などを用いて下記の式にフィッティングさせようと考えています。Visual Basic で作成した測定プログラムの中で使用したいのですが,具体的にどのようなアルゴリズムでフィッティングを行えばいいのか分かりません。

Y = A * sin(X - C)^2 + B

実測する x[i] の範囲は狭く,例えば -15°~ +15°まで 0.2°毎の計 151 プロット,といった感じです。そして定数 A,B,C の内,最も高い精度で求めたい定数は C です。測定の段階で x の範囲を狭めているのは,正確な C (通常 1°未満)を求めるためです。

この測定は x[i] にはほとんど誤差が含まれませんが y[i] には誤差があります。y[i] の含まれている誤差は試料によってまちまちなので,一概には言えません。目視ではほとんど誤差が分からない綺麗なカーブの場合,逆に目視で辛うじて下に凸の曲線が分かる程度の場合,どちらもあり得ます。

考え方だけでも構いませんので,どうかご教授下さい。よろしくお願いいたします。

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

A 回答 (11件中11~11件)

過去に最小二乗法(最小自乗法)の質問はかなりあり,


回答も相当なものが出ています.
質問検索で検索されましたでしょうか?

中でも
http://oshiete1.goo.ne.jp/kotaeru.php3?q=97271
http://oshiete1.goo.ne.jp/kotaeru.php3?q=98446
http://oshiete1.goo.ne.jp/kotaeru.php3?q=33318
http://oshiete1.goo.ne.jp/kotaeru.php3?q=28839
http://oshiete1.goo.ne.jp/kotaeru.php3?q=24627
あたりは参考になるかと思います.
特に stomachman さんがお得意のようで,
大変熱心に回答されておられます.
    • good
    • 0
この回答へのお礼

> 質問検索で検索されましたでしょうか?

申し訳ありません。検索しておりませんでした。

siegmundさんのおっしゃるURLは非常に参考になりました。この度は,ご回答ありがとうございました。

お礼日時:2001/12/06 01:30

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

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

このQ&Aを見た人が検索しているワード

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

Q最小二乗法の過程で分散共分散行列が・・・・

最小二乗法の過程で分散共分散行列が目にしました。

重回帰モデルが
y=Xβ+ε
で与えられるとき、最小二乗法を施すと
βの期待値bが
(XT・X)-1・XT・yで表せるのですが、
(ただし、XTは行列Xの転置行列、-1は逆行列を表します。)

大事なのがここからで、
この (XT・X)-1  というものが、有名な形らしく、分散共分散行列と呼ばれるらしいのです。
どうして、この行列が分散を表す行列になるのかが、いまいちつかめないのです。ご存知の方がいらっしゃいましたらぜひ教えてください。
助けてください!!よろしくお願いします!!

Aベストアンサー

#1です。再度補足。

1)分散の定義そのものです。
詳しくは確率変数の平均値が0でないときの分散の定義を見てください。

2)(X'X)^(-1) X'Xβ- β=0になるということでしょうか?
その通りです。(X'X)^(-1) X'X = I 、すなわち単位行列でしょう?

3)E[(b-β)(b-β)'] = σ^2 (X'X)^(-1)
地道に計算すれば解けるのですが、
E[(b-β)(b-β)'] = E[((X'X)^(-1) X'(Xβ + ε) - β)((X'X)^(-1) X'(Xβ + ε) - β)']
= E((X'X)^(-1) X'ε) ((X'X)^(-1) X'ε)']
= E[((X'X)^(-1) X'ε) (ε'X((X'X)^(-1))]
= ((X'X)^(-1) X'E[εε']X((X'X)^(-1))
= ((X'X)^(-1) X'σ^2 X((X'X)^(-1)) ←σ^2 はスカラーなので前に出せる(単位行列は消す)
= σ^2 (X'X)^(-1) X'X(X'X)^(-1)
= σ^2 (X'X)^(-1)
となります。

#1です。再度補足。

1)分散の定義そのものです。
詳しくは確率変数の平均値が0でないときの分散の定義を見てください。

2)(X'X)^(-1) X'Xβ- β=0になるということでしょうか?
その通りです。(X'X)^(-1) X'X = I 、すなわち単位行列でしょう?

3)E[(b-β)(b-β)'] = σ^2 (X'X)^(-1)
地道に計算すれば解けるのですが、
E[(b-β)(b-β)'] = E[((X'X)^(-1) X'(Xβ + ε) - β)((X'X)^(-1) X'(Xβ + ε) - β)']
= E((X'X)^(-1) X'ε) ((X'X)^(-1) X'ε)']
= E[((X'X)^(-1) X'ε) (ε'X((X'X)^(-1))]
= ...続きを読む

Aベストアンサー

>所で、今回の問題は
「また、この線形方程式についての結果は何を物語っているか?」
とも問われているのですが
その答えは「∩[i=1,..,m]Ker(yi)の補集合の直交補空間の元を表している」と答えれば正解でしょうか?

●「この線型方程式」とあるが、どこに線型方程式があるのか僕には分かりません。

●意味・意義の解釈は種々にできます。これこそ自分の頭で考えるべきことでしょう。

●あなた自身が指摘してくれた通り、Vはもともと内積は定義されてないのですから、直交補空間をもちだすのは不適切です。内積を用いない解釈を、まずは求められていると思います。
もしも「直交補空間」という概念を用いるなら、どういう内積を入れるのか、書かねばなりません。(僕が「修正」でそうしたように)

●しかしどんな内積を入れたとしても、「「∩[i=1,..,m]Ker(yi)の補集合の直交補空間」は、yiがすべてゼロ写像ならば、V。そうでなければ、{0}になります。(よく考えて見ましょう)

●僕ならば、「この結果は、残念ながら言葉を話せないので、何も物語ることができない」と答えます。
ほとんど自明な結果であり、大した意味があるとは思えませんので、皮肉として。

以上。あまり人にばかり聞かず、自分でよく勉強することを勧めます。
おそらく同じ学校のメンバーがよく問題を丸投げしているので、しばらく答えるのは控えようと思います。

>所で、今回の問題は
「また、この線形方程式についての結果は何を物語っているか?」
とも問われているのですが
その答えは「∩[i=1,..,m]Ker(yi)の補集合の直交補空間の元を表している」と答えれば正解でしょうか?

●「この線型方程式」とあるが、どこに線型方程式があるのか僕には分かりません。

●意味・意義の解釈は種々にできます。これこそ自分の頭で考えるべきことでしょう。

●あなた自身が指摘してくれた通り、Vはもともと内積は定義されてないのですから、直交補空間をもちだすのは不適切です...
続きを読む

Q最小二乗法 擬似逆行列

下のサイトの説明を読んで最小二乗法の勉強をしています。

未知パラメータxが1個(N=1)、出力yが10個(M=10)のとき、
擬似逆行列を求めようとすると、(A#A)^-1 が1×1行列になってしまいます。
このとき逆行列はどのように求めたら良いのでしょうか??勉強不足ですみませんが、よろしくお願いします。

http://www.star.t.u-tokyo.ac.jp/~kaji/leastsquare/leastsquare_main.htm

Aベストアンサー

転置を'で表すことにします。

1×1行列 A'A = [a] の逆行列は [1/a] ですので、擬似逆行列は

(A'A)^(-1)A'=[1/a] A'=(1/a) A'

と計算されます。蛇足ながらこの場合の擬似逆行列は1×M行列となります。

Qx[1]・x[2]・…・x[n]=1 ならば x[1] + x[2] + … + x[n] ≧ n

x[k]>0 (k=1,2,…,n)とする。

このとき、
x[1]・x[2]・…・x[n]=1 ならば x[1] + x[2] + … + x[n] ≧ n

と予想しましたが、証明できるのでしょうか?

また、
x[1] + x[2] + … + x[n] = 1 とすると、x[1]・x[2]・…・x[n] に関する何らかの不等式はあるのでしょうか?

Aベストアンサー

そのまま相加相乗平均ですね。

( x[1] + x[2] + … + x[n])/n≧(x[1]・x[2]・…・x[n])^(1/n)=1
x[1] + x[2] + … + x[n]≧n

反対も同じです。

1/n≧(x[1]・x[2]・…・x[n])^(1/n)
x[1]・x[2]・…・x[n]≦(1/n)^n

Q最小二乗法の過程で分散共分散行列が・・・

最小二乗法の過程で分散共分散行列が目にしました。

重回帰モデルが
y=Xβ+ε
で与えられるとき、最小二乗法を施すと
βの期待値bが
(X'・X)-1・X'・yで表せるのですが、
(ただし、X'は行列Xの転置行列、-1は逆行列を表します。)

このbの分散共分散行列を計算すると
E[(b-E(b))(b-E(b))'] = σ^2 (X'X)^(-1)
となるのですが、
この計算をする際にE(b)=β
とするのですが、どうしてこれが成り立つのでしょうか?
教えてください!!よろしくお願いします。

また、もしよろしければ、次のことを教えてください。ご存じなければ、上の質問だけでももちろん助かります。

bの分散共分散行列
E[(b-E(b))(b-E(b))']
を計算すると
E[εε']=σ^2I
となる過程が出てくるはずです。(Iは単位行列)
どうしてこの変形が出来るのでしょうか?
単位行列にはならないはずですが、単位行列になるという
仮定を用いているようです。
どうしてこの仮定が生じたのか、ご存知の方いらっしゃれば教えてください。とても困っています。

最小二乗法の過程で分散共分散行列が目にしました。

重回帰モデルが
y=Xβ+ε
で与えられるとき、最小二乗法を施すと
βの期待値bが
(X'・X)-1・X'・yで表せるのですが、
(ただし、X'は行列Xの転置行列、-1は逆行列を表します。)

このbの分散共分散行列を計算すると
E[(b-E(b))(b-E(b))'] = σ^2 (X'X)^(-1)
となるのですが、
この計算をする際にE(b)=β
とするのですが、どうしてこれが成り立つのでしょうか?
教えてください!!よろしくお願いします。

また、もしよろしければ、次...続きを読む

Aベストアンサー

> (X'・X)-1・X'・y
E[(X'X)^(-1) X'y] = E[(X'X)^(-1) X'(Xβ + ε)]
= (X'X)^(-1) X'Xβ + (X'X)^(-1) X'E[ε]
= β + 0 = β


最小自乗法でおかれる通常の仮定の中に
E[ε] = 0
E[εε'] = σ^2 I
が含まれています。この仮定をゆるめたモデルも存在しますが、最初はここが基本です。したがってこの仮定から出てきます。

ちょっとだけ解説すると、前者はモデルが正しい (y = Xβ + ε が期待値の意味で成り立つ) ことを主張しており、後者は誤差項はそれぞれ独立で同じ分散を持つ、ということを主張しています。

Q何故,[g]=[Ψ]1[f][Φ]^-1ではなく[g]=[Ψ]^-1[f][Φ]なの?

[v_1,v_2,…,v_n],[v'_1,v'_2,…,v'_n]を線形空間Vの基底とする。
[w_1,w_2,…,w_m],[w'_1,w'_2,…,w'_m]を線形空間Wの基底とする。

それで図のように

fを基底[v_1,v_2,…,v_n]から基底[w_1,w_2,…,w_m]での線形写像。
gを基底[v'_1,v'_2,…,v'_n]から基底[w'_1,w'_2,…,w'_m]での線形写像。
そしてΦを[v_1,v_2,…,v_n]から[v'_1,v'_2,…,v'_n]への基底変換の写像。
Ψを[w_1,w_2,…,w_m]から[w'_1,w'_2,…,w'_m]への基底変換の写像とすると
gの表現行列を[g]と表す事にすれば
[v'_1,v'_2,…,v'_n]→[v_1,v_2,…,v_n]→[w_1,w_2,…,w_m]→[w'_1,w'_2,…,w'_m]と写されるので
[v'_1,v'_2,…,v'_n]→[v_1,v_2,…,v_n]はΦ^-1,
[v_1,v_2,…,v_n]→[w_1,w_2,…,w_m]はf,
[w_1,w_2,…,w_m]→[w'_1,w'_2,…,w'_m]はΨで
結局[g]=[Ψ][f][Φ]^-1となると思ったのですがなぜか本には
[g]=[Ψ]^-1[f][Φ]となっています。何処を勘違いしたのでしょうか?

[v_1,v_2,…,v_n],[v'_1,v'_2,…,v'_n]を線形空間Vの基底とする。
[w_1,w_2,…,w_m],[w'_1,w'_2,…,w'_m]を線形空間Wの基底とする。

それで図のように

fを基底[v_1,v_2,…,v_n]から基底[w_1,w_2,…,w_m]での線形写像。
gを基底[v'_1,v'_2,…,v'_n]から基底[w'_1,w'_2,…,w'_m]での線形写像。
そしてΦを[v_1,v_2,…,v_n]から[v'_1,v'_2,…,v'_n]への基底変換の写像。
Ψを[w_1,w_2,…,w_m]から[w'_1,w'_2,…,w'_m]への基底変換の写像とすると
gの表現行列を[g]と表す事にすれば
[v'_1,v'_2,…,v'_n]→[v_1,v_2,…,v_n]→...続きを読む

Aベストアンサー

記号を整理しておく。

線形写像T: V→Wを、Vの基底[v1,...,vn]とWの基底[w1,...,wn]で表現した行列を[f]、
同じ線形写像Tを、Vの基底[v'1,...,v'n]とWの基底[w'1,...,w'n]で表現した行列を[g]で表す。
[v1,...,vn]から[v'1,...,v'n]への基底変換の行列を[Φ]とする。
(v'1,...,v'n)=(v1,...,vn)[Φ]

[w1,...,wn]から[w'1,...,w'n]への基底変換の行列を[Ψ]とする。
(w'1,...,w'n)=(w1,...,wn)[Ψ]

Vの元を基底[v1,...,vn]で表現したものを[x]、
同じ元を基底[v1,...,vn]で表現したものを[x']で表すと、(回答#2より)
[x]=[Φ][x']

同様に、Wの元を基底[w1,...,wn]で表現したものを[y]、
同じ元を基底[w1,...,wn]で表現したものを[y']で表すと、
[y]=[Ψ][y']

線形写像Tを基底[v1,...,vn]と基底[w1,...,wn]で表すと、
[y]=[f][x]
同じ線形写像Tを基底[v'1,...,v'n]と基底[w'1,...,w'n]で表すと、
[y']=[g][x']

これらの関係から、
[y']=[Ψ^-1]*[y]=[Ψ^-1]*[f][x]=[Ψ^-1][f][Φ][x']
となり、これを[y']=[g][x']と見比べると、
[g]=[Ψ^-1][f][Φ]
となっていることがわかる。

最初の質問にあった、
>[v'_1,v'_2,…,v'_n]→[v_1,v_2,…,v_n]→[w_1,w_2,…,w_m]→[w'_1,w'_2,…,w'_m]と写されるので
の対応はベクトル間の対応であって、だからこそ、その係数(=成分)の対応はこれとちょうど逆の変換を受けるのである。このことは、
[v][x]=[v'][Φ^-1]*[Φ][x']
[w][y]=[w'][Ψ^-1]*[Ψ][y']
と表してみてもわかる。ベクトルの成分[x']は行列[Φ]によって[x]にうつり、同じく成分[y']は行列[Ψ]によって[y]にうつっている。だから、同一の線形写像が
f:[x]→[y]
g:[x']→[y']
と表現されているなら、[Ψ][g][x']=[f][Φ][x']となっていて、いいかえると、
[x']→[y']の対応は、[x']→[x]→[y]→[y']という対応をたどったときも、一致していなくてはならない。だから、成分で考えたとき、[g]は、[Φ]→[f]→[Ψ^-1]と同一になるのである。つまり[g]=[Ψ^-1][f][Φ]。

あなたのいう[Φ^-1]→[f]→[Ψ]は、基底ベクトルの対応関係であって、成分表示と混同してはいけない。

記号を整理しておく。

線形写像T: V→Wを、Vの基底[v1,...,vn]とWの基底[w1,...,wn]で表現した行列を[f]、
同じ線形写像Tを、Vの基底[v'1,...,v'n]とWの基底[w'1,...,w'n]で表現した行列を[g]で表す。
[v1,...,vn]から[v'1,...,v'n]への基底変換の行列を[Φ]とする。
(v'1,...,v'n)=(v1,...,vn)[Φ]

[w1,...,wn]から[w'1,...,w'n]への基底変換の行列を[Ψ]とする。
(w'1,...,w'n)=(w1,...,wn)[Ψ]

Vの元を基底[v1,...,vn]で表現したものを[x]、
同じ元を基底[v1,...,vn]で表現したものを[x']で表すと、(...続きを読む

Q最小二乗法 行列

現在以下のページを参考に最小二乗法の勉強をしています。
誤差の二乗ノルムを求めるときに、
 || e || ^2 = e*e
= (y-Ax)*(y-Ax)
= (y*-x*A*)(y-Ax)
= y*y - y*Ax -x*A*y + x*A*Ax  (1)
この次に
       = y*y - 2y*Ax + x*A*Ax
と変形できるのはなぜなんでしょうか?
(1)の第3項目 x*A*y が第2項目と等しくなる過程が分かりません。
後、次の二乗ノルムを微分する過程も良くわかりません。

すみませんが、よろしくお願いします。


http://www.star.t.u-tokyo.ac.jp/~kaji/leastsquare/leastsquare_main.htm

Aベストアンサー

共役転置行列の定義を確認し、公式
(AB)* = (B*)(A*),
A** = A
を証明してみてください。
これにより、(x*)Ay の共役転置は、
{ (x*)(A*)y }* = (y*)(A**)(x**) = (y*)Ax です。

(x*)Ay は、スカラー(1行1列の行列)ですから
{ (x*)Ay }' = (x*)Ay となりますが、
実数値であれば { (x*)Ay }~ = (x*)Ay なので、
結局、
{ (x*)Ay }* = { (x*)Ay }'~ = { (x*)Ay }~ = (x*)Ay です。

Aベストアンサー

(*)式が間違っているように見えますが・・・。これではn=3のときにしか成立しません。
n=4のとき
P(C(1)∪C(2)∪C(3)∪C(4))
= P(C(1))+P(C(2))+P(C(3))+P(C(4))
-P(C(1)∩C(2))-P(C(1)∩C(3))-P(C(1)∩C(4))-P(C(2)∩C(3))-P(C(2)∩C(4))-P(C(3)∩C(4))
+P(C(1)∩C(2)∩C(3))+P(C(1)∩C(2)∩C(4))+P(C(1)∩C(3)∩C(4))+P(C(2)∩C(3)∩C(4))
-P(C(1)∩C(2)∩C(3)∩C(4))
というのは理解されていますか?

正しくは、
P(∪[i=1..n]C(i))
= Σ[i=1..n]P(C(i))-Σ[i1,i2=1..n, i1<i2]P(C(i1)∩C(i2))+Σ[i1,i2,i3=1..n, i1<i2<i3]P(C(i1)∩C(i2)∩C(i3))
-Σ[i1,i2,i3,i4=1..n, i1<i2<i3<i4]P(C(i1)∩C(i2)∩C(i3)∩C(i4))+…+(-1)^(n-1)P(∩[i=1..n]C(i))
となり、交互に符号が代わり共通部分を取る集合の数も1つずつ増えます。

証明の方針はあっていますよ。

(*)式が間違っているように見えますが・・・。これではn=3のときにしか成立しません。
n=4のとき
P(C(1)∪C(2)∪C(3)∪C(4))
= P(C(1))+P(C(2))+P(C(3))+P(C(4))
-P(C(1)∩C(2))-P(C(1)∩C(3))-P(C(1)∩C(4))-P(C(2)∩C(3))-P(C(2)∩C(4))-P(C(3)∩C(4))
+P(C(1)∩C(2)∩C(3))+P(C(1)∩C(2)∩C(4))+P(C(1)∩C(3)∩C(4))+P(C(2)∩C(3)∩C(4))
-P(C(1)∩C(2)∩C(3)∩C(4))
というのは理解されていますか?

正しくは、
P(∪[i=1..n]C(i))
= Σ[i=1..n]P(C(i))-Σ[i1,i2=1..n, i1<i2]P(C(i1)∩C(i2))+Σ[i1,i2,i3=1..n, i1<i2<i3]P...続きを読む

Q分子構造の重ねあわせ (行列、最小二乗法など?)

すいません、化学っぽい内容の質問なのですが、
アルゴリズムは数学になると思うのでこちらで質問させていただきます。
また、説明不足を補うために一部プログラムっぽい表記をさせていただきますのでご了承ください。

現在、分子構造を比較するためのプログラムを作成しています。
そのプログラムに構造の「重ね合わせ」機能を追加したいのですが
そのアルゴリズムに最小二乗法などが必要らしく、悩んでいます。
(詳細は長くなるので下に書きます)

分かる方がいましたらご教示お願いします。
よろしくお願いします。


■重ね合わせについて
分子構造のデータは、各原子がそれぞれX, Y, Z座標の3つの値を持っています。
例えば、200原子からなる分子のデータ構造は以下のようになります。

Atom { double x; double y; double z; }
Atom atom = new Atom[200];

重ね合わせる2つの構造は原子数は同じとします。なので、分子構造2つをa1, a2とし、
対応する点の誤差をとっていくと、誤差の平均を求める計算は以下のようになります。

Atom a1 = new Atom[200];
Atom a2 = new Atom[200];
double d = 0;
for (i = 0; i < a1.length; i++)
d += sqrt(pow((a1[i].x-a2[i].x),2) + pow((a1[i].y-a2[i].y),2) + pow((a1[i].z-a2[i].z),2));
d = d / a1.length;

このdの値が最小値をとるようにa2の原子の座標を変更することを「重ね合わせ」と定義します。


■重ね合わせのアルゴリズムについて
基準となる構造に対し、もう一つの構造を並進や回転によって合わせる感じになると思います。
今回質問する箇所はこのアルゴリズムになります。
この際に行列計算や最小二乗法を使うことになるかと思われます。

■質問者の考え
途中まで、しかも間違っている可能性がありますが私の考えたアルゴリズムを追記しておきます。
(i) a1, a2の重心を求める
double x1 = y1 = z1 = x2 = y2 = z2 = 0;
for (i = 0; i < a1.length; i++) {
x1 += a1[i].x; y1 += a1[i].y; z1 += a1[i].z;
x2 += a2[i].x; y2 += a2[i].y; z2 += a2[i].z;
}
x1 = x1 / a1.length; y1 = y1 / a1.length; z1 = z1 / a1.length;
x2 = x2 / a1.length; y2 = y2 / a1.length; z2 = z2 / a1.length;

a1の重心(x1, y1, z1)とa2の重心(x2, y2, z2)が求まります。

(ii) 重心の誤差を求め、誤差をa2の各原子の座標に反映させる
xd = (x2 - x1); yd = (y2 - y1); zd = (z2 - z1);
for (i = 0; i < a1.length; i++) {
a2[i].x -= xd;
a2[i].y -= yd;
a2[i].z -= zd;
}

この方法で誤差はかなり小さくなります。しかし、最小値にはなってないと思われます。
なので、この方法が正しいのかよく分かりません。

すいません、化学っぽい内容の質問なのですが、
アルゴリズムは数学になると思うのでこちらで質問させていただきます。
また、説明不足を補うために一部プログラムっぽい表記をさせていただきますのでご了承ください。

現在、分子構造を比較するためのプログラムを作成しています。
そのプログラムに構造の「重ね合わせ」機能を追加したいのですが
そのアルゴリズムに最小二乗法などが必要らしく、悩んでいます。
(詳細は長くなるので下に書きます)

分かる方がいましたらご教示お願いします。
よろし...続きを読む

Aベストアンサー

こんにちは.
ソースコードは良く見てませんが…
要するに合同であることが期待されるn点のデータ集合XとX'に関して,
Σ ||Xi' - (R*Xi+T) ||^2 -> min
なる回転と並進ベクタを計算したいと考えます.
ここで,XiとXi'はi番目の座標を意味する3次元ベクタであり,
総和演算は範囲(i=1,...,n)とします.

質問者様の方法では上記の変換(R,T)に関して,
並進量Tまでしか解決できません.
ここからさらに回転量Rを解決する必要があります.
基本的な戦略は相関行列を特異値分解してRを決定します.
Rの推定には質問者様の方法で重心を合わせたXとX'に関して
M = Σ Xi'*Xi^T
なる3*3相関行列を計算し,M -> U*D*V^T と特異値分解します(^Tは転置記号).
最小二乗の意味で最適なRは
R = U*V^T
で計算できます.
ただし,回転の向きは適宜調整してください.

データ集合XとX'が相似の意味で同じである場合は
重心を会わせた後にスケール調整を行ってください.

こんにちは.
ソースコードは良く見てませんが…
要するに合同であることが期待されるn点のデータ集合XとX'に関して,
Σ ||Xi' - (R*Xi+T) ||^2 -> min
なる回転と並進ベクタを計算したいと考えます.
ここで,XiとXi'はi番目の座標を意味する3次元ベクタであり,
総和演算は範囲(i=1,...,n)とします.

質問者様の方法では上記の変換(R,T)に関して,
並進量Tまでしか解決できません.
ここからさらに回転量Rを解決する必要があります.
基本的な戦略は相関行列を特異値分解してRを決定します.
Rの推...続きを読む

QMathematica f[{x, y}]を f[{a, x, y}]に変えたい

関数の f[{x, y}]+g[{z, w}] という式があったときに,これらの式の f や g の中に入っているリスト(今の場合は,{x, y}や{z, w})の先頭に,a を付け加えて, f[{a, x, y}]+g[{a, z, w}] のようにしたいと考えています.
(すなわち,f[{x, y}]+g[{z, w}]を f[{a, x, y}]+g[{a, z, w}]に変えたり,また他の例としては,f[{x, y}]+g[{z, w}]+h[{c, d}]を f[{a, x, y}]+g[{a, z, w}]+h[{a, c, d}]に変えたりしたい.)

このとき,例えばPretendを使うと,
Prepend[f[3, 1], 2]
によって,f[2, 3, 1]が得られることなどは知っていますが,上記のようなものに対して,どのようにすればよいのかが,わかりません.

もしもご存じの方がおられれば,お教え頂けないでしょうか?

Aベストアンサー

パターンマッチングを使うのがMathematica的です。

f[{x, y}] + g[{z, w}] /. {s_Symbol[{args__}] -> s[{a, args}]}


人気Q&Aランキング