Nx + My + Lz = F
Ox + Py + Qz = H
というような(x,y,z)を求める方程式があるとします。
この方程式の解がひとつには絞られず、二通りあるとする場合のプログラムはどのように書けばいいのでしょうか?
解が1つに絞られるような方程式ならサンプルプログラムがいくつかあったのですが、解が一通りではなく二通りのものは見つけることが出来ませんでした。
分かる方がいましたら、よろしくお願いします。
二通り? 無限にあるんじゃないですかその場合?
2式からzを消去すればxとyの関係式が出て
くるんだから、それを満たすx,yの組は山ほどあるでしょ。
つか、これはプログラミングの問題ではないんじゃない?
わたしも初心者ですがこれは質問が漠然としすぎているとおもいます。
具体的にどういう式なんでしょうか?
といっても質問に答えられそうではありませんけど
すみません、ユh苧音怎゜^ぎました。
書暴は3つのボゥ`ルを屡岑泣としそれを゜`う叔業からカメラで2旦顔唹し、その鮫からカメラ了崔を竃そうとしています。
そのモ許レ\隈をプログラムに岷したかったのです。モ許ヵサは參和の宥りです。
屡岑泣を3つとし、それぞれの了崔をベクトルとして深えp1、p2、p3とする。
カメラ了崔をgとし、カメラから屡岑泣までの鉦﹄をd1、d2、d3とする。
この瓶カメラ了崔gは參和の塀で箔まる。
i = 1 ゛ 4に拳して
di = || pi ィC g ||
!゛xを徭—し
di^2 = ||pi||^2 + ||g||^2 ィC 2ヾpi , gゝ
i=2からi=1の壱ク呂pずる
d2^2 - d1^2 = (||p2||^2 + ||g||^2 ィC 2ヾp2 , gゝ) ィC (||p1||^2 + ||g||^2 ィC 2ヾp1,gゝ)
= (||p2||^2 - ||p1||^2) ィC 2ヾp2 ィC p1, gゝ
緒「辰ニ
ヾp2 ィC p1, gゝ= 1/2 ((||p2||^2 - ||p1||^2) ィC (d2^2 ィC d1^2)
揖に
ヾp3ィC p2, gゝ とヾp4 ィC p3, gゝ も箔めると
ヾp3 ィC p2, gゝ = 1/2 ((||p3||^2 - ||p2||^2) ィC (d3^2 ィC d2^2)
ヾp4 ィC p3, gゝ = 1/2 ((||p4||^2 - ||p3||^2) ィC (d4^2 ィC d3^2)
參貧3つの塀を゜B羨させる
(p2x ィC p1x)gx + (p2y ィC p1y)gy + (p2z ィC p1z)gz = 1/2 ((||p3||^2 - ||p2||^2) ィC (d3^2 ィC d2^2)
(p3x ィC p2x)gx + (p3y ィC p2y)gy + (p3z ィC p2z)gz = 1/2 ((||p4||^2 - ||p3||^2) ィC (d4^2 ィC d3^2)
(p4x ィC p3x)gx + (p4y ィC p3y)gy + (p4z ィC p3z)gz = 1/2 ((||p2||^2 - ||p1||^2) ィC (d2^2 ィC d1^2)
參貧。
この゜B羨圭殻塀を盾きたかったのです。しかし、屡岑泣が4つの壱ク呂覆藉陲┐ャ1つになるのですが、屡岑泣が3つの壱ク牢陲┐♡欧蝶討靴泙Δ海箸砲覆蠅泙后海譴鮟笵Qするプログラムを恬りたいのです。
文字化けしてしまったので、同じ文章をもう一度書き込みます。
すみません、説明不足過ぎました。
今私は3つのボールを既知点としその既知点を2つの視点から撮影し、その画像からカメラ位置を特定しようとしています。
その計算をプログラムに直したかったのです。計算式を以下に示します。
既知点を4つとし、それぞれの位置をベクトルとして考えp1、p2、p3とする。
カメラ位置をgとし、カメラから既知点までの距離をd1、d2、d3とする。
この時カメラ位置gは以下の式で求まる。
i = 1 〜 3に対して
di = || pi ? g ||
両辺を自乗し
di^2 = ||pi||^2 + ||g||^2 - 2〈pi , g〉
i=2からi=1の場合を減ずる
d2^2 - d1^2 = (||p2||^2 + ||g||^2 - 2〈p2 , g〉) - (||p1||^2 + ||g||^2 - 2〈p1,g〉)
= (||p2||^2 - ||p1||^2) - 2〈p2 - p1, g〉
従って
〈p2 - p1, g〉= 1/2 ((||p2||^2 - ||p1||^2) - (d2^2 - d1^2)
同様に
〈p3- p2, g〉 と〈p4 - p3, g〉 も求めると
〈p3 - p2, g〉 = 1/2 ((||p3||^2 - ||p2||^2) - (d3^2 - d2^2)
以上2つの式を連立させる
(p2x - p1x)gx + (p2y - p1y)gy + (p2z - p1z)gz = 1/2 ((||p3||^2 - ||p2||^2) - (d3^2 - d2^2)
(p3x - p2x)gx + (p3y - p2y)gy + (p3z - p2z)gz = 1/2 ((||p4||^2 - ||p3||^2) - (d4^2 - d3^2)
上記の連立方程式を計算可能な所を計算し、変数を代入すると
(p1x)gx + (p1y)gy + (p1z)gz = p1
(p2x)gx + (p2y)gy + (p2z)gz = p2
となります。しかしここで問題があり、既知点が4点なら回答が1つになるのですが、既知点が3点の場合では回答が2つになってしまうようなのです。
これを解決し計算できるプログラムを作成したいのです。
計算の詳細は見ていませんが、
> しかしここで問題があり、既知点が4点なら回答が1つになるのですが、既知点が3点の場合では回答が2つになってしまうようなのです。
とありますが、電卓等を用いた手計算で、1つの回答が得る方法がないのですか?
だったら、基本的にプログラムでそれを求めることはできません。
コンピューターは所詮計算機でしかなく、
プログラムとは、人が決めた手順で計算するのを自動化しているだけです。
あなたが手計算で解決できない問題は、プログラムでは計算できません。
ただ、プログラムで自動化させると、繰り返し同じ処理をさせても、
人とは異なり、基本的に文句を言わずに計算してくれます。
例えば1から1000までの整数を順番に代入して、
求める値になるまで計算を繰り返すようなことをする場合、
人にやらせると文句をいいますが、
コンピュータなら文句も言わずに計算を繰り返してくれます。
だから、適当な範囲で順番に全ての値を代入して答えを求めるような手法を用いることはできるのです。
以前の続きなのですが、カメラ位置を求める計算式は分かりました。
そこで、これをプログラムに直したいのですがどのようにすればいいでしょうか?
度々質問させていただいている上、不明瞭な質問ばかりになりがちですが、よろしくお願いします。
既知点を3つとし、それぞれの位置をベクトルとして考えp1(5,15,4)、p2(10,5,3)、p3(20,10,2)とする。カメラ位置をgとし、カメラから既知点までの距離をd1:37,d2:34,d3:24とする。
この時カメラ位置gは以下の式で求まる。
>(p2x - p1x)gx + (p2y - p1y)gy + (p2z - p1z)gz = 1/2 ((||p2||^2 - ||p1||^2) - (d2^2 - d1^2)
>(p3x - p2x)gx + (p3y - p2y)gy + (p3z - p2z)gz = 1/2 ((||p3||^2 - ||p2||^2) - (d3^2 - d2^2)
これより、2つの平面は
5x-10y-z=(1/2)(10^2+5^2+3^2-5^2-15^2-4^2)-(34^2-27^2))=81/2
10x+5y-z=(1/2)(20^2+10^2+2^2-10^2-5^2-3^2)-(24^2-34^2))=475
(5,-10,-1)と(10,5,-1)に直交するベクトルは、外積をとって
(|-10, -1| |-1 5| |5 -10|)
(| 5, -1|, |-1 10|,|10 5|)
=(15,-5,125)
=5(3,-1,25)
となります。2平面の交線上の点を z=0 として求めるとx=1981/50 y=394/25なので、
交線の方程式は
x=3t+1981/30
y=-t+556/25
z=25t
となります。これを最初の球の方程式
d1^2 = (x-p1x)^2 + (y-p1y)^2 + (z+p1z)^2
に代入して
(3t+1981/30-5)^2+(-t+556/25-15)^2+(25t-4)^2=37^2
というtの2次方程式をえます。
これを解くと
t=-0.497173868068102, 0.487410088540544
そして、その時のカメラ位置は
(38.1284783957957,16.2571738680681,-12.4293467017026)(41.0822302656216,15.2725899114595,12.1852522135136)
となる。
ピンポイントでどこをどうしたいのか言ったほうがいいと思いますよ。
回答が二つあったとして場合場合でどの式に代入するか?ということですか?
…解き方わかってるやないですか。
それをそのまんまコードに落とすだけではないかと。
こんな教育方針でよいのか?立○館よ。
彼の地では
> これからプログラムに直してみたいと思います。
と仰ってますから十分に理解できていらっしゃるに違いありません。
解決ですね。
確かに質問の仕方が悪いですね。
しかし、まあプログラムには直す事が出来たので解決しました。
すみません。
ツイート | ![]() |