「空間中の2直線間に、共通垂線を一本引いて、垂線が各直線に対して持つ二つの足の間の距離(---1)と、二つの足の間の中点の位置(---2)」を、求めたいのですが、どのようにするのでしょうか. 

直線は、"平面xy座標上の一点aを通り、かつ、方位角bと仰角cとで定まる方向"という形式で与えられるのです.

最終目標としては、空間中にいろいろと与えられる二直線について、冒頭の「」を求めるプログラムを書きたいのです.

また、冒頭の「」内のことは、捩れの位置で始めて成立するわけですが、交わるのか捩れの位置なのかを、プログラムでもって、簡単に識別する方法ってあるのでしょうか?

このあたりの領域に詳しい方、どうぞ教えてください.

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

A 回答 (5件)

ベクトルを考えると考えやすいです。



まず、2直線をA,Bとし、それぞれの単位方向ベクトルをa^b^します。
(方位角と仰角からすぐにだせます)

また、xy座標平面上で、直線Aの交点 Aa から直線Bの交点 Ba に引いたベクトルをc_ 置きます。(ちょっと分かりにくいですが、x^ は単位ベクトル、x_ はベクトルを表すとします)
また垂線に平行な単位ベクトルをn^ と置き、2直線の距離(足の間の距離)をd と置きます。

すると
 n^⊥x^, n^⊥y^  (1)
n^ = x^ × y^ (外積) (2)
としよてく、また、α、βを直線A,B上で足の位置を表すパラメータとして
α x^ + d n^ = c_ + β y^ (3)
が成立します。この式の両辺似たいしてn^ との内積をとり、(1)とn^ の大きさは1であることに注意すると求める距離d は
 d = c_・n~ 
と簡単に求まります。

また、(3)式からx^ と内積をとった式、y^ と内積をとった式、を作るなどしてαを求めます。

直線A のxy平面上の点Aa に引いた位置ベクトルをe_ で表せば、中点の位置は
 e_ + α x^ + (d / 2) n^
で表されます。

このやり方で求めたとき、交わるときには
 d = 0
を与え、特別にチェックする必要は無いです。
むしろ特別な配慮が必要なのは2直線の平行度で、平行な時には上の量は本当に数学的にも定義できなくなります。
平行に近いとき(厳密に平行でなくても)、プログラム上では非常に誤差が大きくなりますので、適当に誤差を見積もり、評価してやる必要があります。
(x^ と y^ の内積をとって平行度を調べるなどして)
    • good
    • 0
この回答へのお礼

ありがとうございます.最初はわからなかったのですが、解ったらすごく簡単に書けることに驚きました.以下のように、自分なりに、まとめてみたのですが、あっているでしょうか.
-------------------------------------------------------------------------------------
直線Aとxy平面との交点a_=(ax, ay, az)
直線Aの方位角θa
直線Aの仰角φa

直線Bとxy平面との交点b_=(bx, by, bz)
直線Bの方位角θb
直線Bの仰角φb

とすると、上記の値だけを使って、以下の左辺の値は、右辺のように書くことができる.

直線Aの単位ベクトル a^=(cos(θa)cos(φa), sin(θa)cos(φa), sin(φa))
直線Bの単位ベクトル b^=(cos(θb)cos(φb), sin(θb)cos(φb), sin(φb))

共通垂線の単位ベクトル n^=a^×b^

共通垂線の足間距離 d= (b_-a_)・(a^×b^)
[=即ち直線間距離]  = (b_-a_)・n^


共通垂線足間中点位置 m_=a_ + α a^ + (d/2) n^
[即ち直線間中点]    =a_ + α a^ + (1/2){(b_-a_)・(a^xb^)}・(a^×b^)

但しα=[{a^・(b_-a_)}-{b^・(b_-a_)*(a^・b^)}]/{1-(a^・b^)(a^・b^)} (但しa^・b^=1でない時)
-------------------------------------------------------------------------------------

お礼日時:2001/05/19 13:09

くどいですが、もう一つ補足。



2直線の外積を求めるやり方でも、私流のやり方でもコストは変わらんと言いましたが、実際に計算してみると、私流のやり方の方がコストが安いと分かりました。

直線上のパラメータt0,t1、v0,v1:直線の方向(単位ベクトル)、p0,p1:通過点とすると、直線上の点は

P0(t)=p0+t0*v0
P1(t)=p1+t1*v1

1) 2直線を通過する2点の差分ベクトル:p01=p0-p1
2) 内積 s01=v0・v1
3) 内積 s0 =v0・p01
4) 内積 s1 =v1・p01

として、
5) det=s01^2 – 1.0
6) t0 = (-s0 + s01*s1) / det
7) t1 = ( s1 - s01*s0) / det

直線上のパラメータt0,t1が求まります。ここまでで、乗除算:11回、加減算:10回。

一方、外積を取るやり方だと、外積計算だけで、乗除算:12回、加減算:3回。その後、正規化するわけですが、掛け算3回、足し算2回、それに、sqrt()という四則演算に比べてズッとコストのかかる計算をしなくてはならないのです。

しかし、球座標で持つようだと、複数回の三角関数の計算に更に時間を要するので結局どちらでも大差なくなってしまいます。
    • good
    • 0
この回答へのお礼

皆さんありがとうございました.ポイントですが、お二人に同じく20ポイントx10をつけたいぐらいです.特にametsuchiさんの各論の回答はものすごく重要です.今後ともどうぞよろしくお願い致します.

お礼日時:2001/05/29 10:32

hogehogeninjaさんの訂正もあったのでお任せしとこうと思いましたが、finetoothcombさんから質問が出てきたので再びシャシャリでてきました。



1)「別方法」:

私は「コストのかかる計算」は嫌いで、外積よりも内積計算を好みます。外積を使って計算時間やコーディングステップ数が減る場合に限って外積を使います。

今の問題の場合、hogehogeninjaさんの言われるように、題意を充たす時、

 n^⊥x^, n^⊥y^  (1)
だから
n・x^=0、 n・y^=0 (1’) 

です。x^、y^はGiven。「n」は、線上の2パラメータ:α、βに依存しますが、(1’)の条件を課すと、α、βに関する2元一次の連立方程式が得られます。
と言っちゃうと非常にシチメンドクサイことのようですが、紙の上で整理・計算するととても簡単な形になります。

ただ、実質的には、同じ計算量で、外積を使ったからコストがよりかかるという訳ではない(はず)です。ですから、気にしないで下さい。finetoothcombさんにとって分かり易い方を選択してください。

2)「この演算を実行する前段階に、|n_|=0...」

その通りです。2ベクトルの内積による検査を省き、この分母が0に近いかどうかを見ればよいのです。そうすればあとはゼロ割や精度の低下を気にしないでいいです。

ただ、その判定基準、「閾値」だの「トレランス」だのと言いますが、それが実は問題なのです。0割を防ぐだけなら、Cのヘッダファイル("float.h")に入っている「FLT_EPSILON」、または「DBL_EPSILON」でもいいのですが、場合によってはもっと大きい数値になる場合もあります。最下層のライブラリとしては、

a)引数として外に出すこと。(=呼び出し側から値を与える)
b)全体として、矛盾を生じないように、「距離」、「角度」など明確な「単位」を持たせることが望ましい。「角度」はコストのかかる計算になりがちなので、正規化したベクトル同士の「内積値」を使う場合がある。

今回の場合、「ベクトル同士の内積値評価は無駄」と言いましたが、それに相当するように、εを手計算で決めておけばいいのです。

上位側、即ちライブラリを使う側を含めてシステム全体で、「ゼロ割りを起こさないよう」気を付けているだけでは、矛盾をきたします。この辺は10分20分で語り尽くせないところなので、省略します。

3)「幾何計算ライブラリ」の目的・利点:

仰せのとおり、「速度向上でなく、再利用性の向上」のためです。処理速度は一般的には遅くなります。

「再利用性の向上」は、広い意味で言われているのだと思いますが、
a)開発工数の減少
b)障害発生頻度の減少
c)メンテナンスのし易さ
d)慣れた人がライブラリを開発することにより、品質や、性能(「処理速度」も)が向上
e)後で全く別のシステムに再利用(=狭義の「再利用性」)

とメリットは限りなくあります。

4)(開発)環境:

Borland C+ 5.5.1 だろうが、VC++だろうが、基本は同じです。AnsiのC++で書けばいいのではないでしょうか?

私は20年以上各種の幾何計算ライブラリの開発に関わってきましたが、基本は、

■処理系に依存しない
■なるべく保守的に書く

ということです。それでも、ここ20年の間になるべく保守的に選んだ言語ですら、

・Fortran4
・Fortran77
・C(K&R)
・AnsiC
・AnsiC++(VC++だが..)

と変わりました。しかし、上の思想で作っておくと、DOSだろうと、UNIXだろうと、問題なく動きます。一昨年通信会社向けに作ったライブラリもSGIと、PCで問題なく動いています。

しかし去年別の用途で作ったものは心ならずも、

・MFC

を使っています。これだと、SGIやSunなどのEWSに持って行けないです。初めからターゲットマシンが限定されていましたし...。

5)三角関数利用について:

今の持ち方だと、
・直線の通る位置は直交座標
・直線の方向は球座標
という変則的な持ち方ですよね?私の経験では、「球座標」は、

a)地球上での位置(緯度・経度)
b)飛行機や自由に3D空間を動くカメラなどの向きを「Euler角」で表現

くらいしか扱ったことがなく、今回の例のように2つの線が「球座標」原点を通る保証がなく一般の捩れの位置にあるというのを大変奇異に感じています。

「球座標」である合理性がなく、基本的に「直交座標」である場合、私の限られた経験では、直線は、
・直線が通る位置(1点)
・直線の方向(単位ベクトル)
で表わすのが普通、というか多かったです。

基本的に「直交座標」でも、カメラ(または「視点」)などを回転させたりするなら、角度や角度を使った三角関数の計算は避けられません。しかし、内部的なデータの持ち方としては、直交座標だけで十分だと私は思います。回転などが加わった場合だけ、座標変換すればいいのです。

三角関数に限定するなら「テーブル云々」は「労多くして益少なし」だと思います。気が付かれているように、角度は任意ですから、補間などしなくてはなりませんから...。
    • good
    • 0
この回答へのお礼

ありがとうございます.経験のある詳しい人に意見を貰うと、ほんと役立つなぁ、と思いました.

>1)「別方法」:

「"内積"のみ使用して攻める方針は、コスト面で事実上の利がある.例外的な高コスト関数(三角関数等)が並存するなら意味がなくなるかもしれぬが(No.4のご説明)」と理解しました.ものすごく役立ちます.ありがとうございました.なにか、思いつかれるヒントがまた発生されましたら、追加補足していただけましたら幸いです.

>2)「この演算を実行する前段階に、|n_|=0...」
>その通りです。…

"float.h"の、FLT_EPSILON, DBL_EPSILONは初耳でした.あー、すごいなぁ. この***_EPSILONを使わしていただこうと思います.あと(2)の後半のご説明は経験に裏打ちされた深い知識に見えて、簡単には理解しきれなかったのでも少し時間をかけて読もうと思います.コメントありがとうございます.

>3)「幾何計算ライブラリ」の目的・利点:

>処理速度は一般的には遅くなります。
え、そうだったんですか.知らなかったです.意外でした.
> …とメリットは限りなくあります。
こ、これはすごい.なるほど~、かなりメリットですね.

>4)(開発)環境:
>■処理系に依存しない
>■なるべく保守的に書く
なるほど.原則このようにする、といろいろ困ったことも起こらず良いいわけですね.あと、MFCだと移植があまりよろしくないという事実は、とても役立ちます.必要に迫られなければ特に使わないようにしようと思いました.

>5)三角関数利用について:
>…今回の例のように2つの線が「球座標」原点を通る保証がなく一般の捩れの位置にあるというのを大変奇異に感じています。
うーん、これは実に嬉しいご指摘です.なぜなら、「奇異なのか、今私が取り組もうとしている(私が自分に課した)課題は」と解るようになれたからです.現状認識を正しくもてることは、ある意味で、励みになります.特にこのあたりのご指摘はものすごく参考になりました. いろいろありがとうございます.

お礼日時:2001/05/21 14:07

ametsuchiさんのおっしゃるとおり、


 n^ は x^ × y^
ではなくて、外積を正規化したものです。
このままやると正しい答えになりません。
finetoothcombさんもつられてしまって
n^=a^×b^
と書いてしまっていますが、
 n_=x^×y^
 n^=n_/|n_|
と訂正させてください。
    • good
    • 0
この回答へのお礼

ありがとうございます.なにしろ知らないことが多いので、なるほど、忘れることがあるから気をつけるべき事なんですね、と、今後に役に立つようで、ありがたい事と感じます.

お礼日時:2001/05/19 20:56

hogehogeninjaさんの答えも的確だし、finetoothcombさんもチャンと理解しているようだから、横から口出すのも何ですが...。



1)hogehogeninjaさんの言われる「n^ = x^ × y^ (外積)(2)」の右辺は単位ベクトルとは限らないので、正規化しなくてはなりません。「n^」はそのつもりで書かれたと思うのですが、finetoothcombさん気を付けてください。私は別の方法をよく使いますが、この方法でも計算量は基本的に同じです。

2)hogehogeninjaさんが、「特別な配慮が必要なのは2直線の平行度云々」はとても大事なことです。幾何計算ライブラリやCADシステムを構築する時、一番厄介なのがこの辺です。ただし、「x^ と y^ の内積をとって平行度を調べる」までもなく、(2)で外積計算をして正規化しなくてはならないので、この際自然に検査が必要になります。だから、このやり方なら、「x^ と y^ の内積をとって平行度を調べ」るのは2度手間です。

3)問題自体、「方位角」、「仰角」になっているのでやむをえないのですが、これには三角関数計算が必要です。三角関数はコストの高い計算で、なるべくなら使わない方がよいです。(この場合は仕方ないです!!!)
    • good
    • 0
この回答へのお礼

ありがとうございます. 有益なコメントに感謝感激です. いろいろな方に方向性の正しさを追認してもらえる、ということにもなり、このジャンルに疎い私としては、ありがたいです.
1-1)外積は正規化が必要なのですね. 気をつけます.
1-2)「別の方法を良く使います(計算量は基本的に同じ)」というのを、お教えいただけたら、とてもありがたいのですが.(どうしても知りたいという訳ではなく、できれば知っておきたいというぐらいなので、もしお時間がありましたらという感じですが.)
2-1)No.3で hogehogeninjaさんが訂正として書いてくださった、n^=n_/|n_|の分母部分ですね.この演算を実行する前段階に、|n_|=0(あるいは、ある小さい値εとして |n_|<ε)かどうかを検査し、もし、それがTRUEなら、平行と見て、処理は中断(というか例外処理)する…という理解をしたのですが、もし間違っていましたら教えてください.
2-2)「幾何計算ライブラリ(やCADシステム)を構築」した経験・知識がなく(やり方が解らない)、Cでべたべたっとプログラムを組むつもりです. 「幾何計算ライブラリ」というのを構築する利点は、速度向上でなく、再利用性の向上というイメージ的理解なのですが、もし間違っていたら教えてくださると幸いです. 使うCの処理系は、DOS上で動くフリーソフトであるところの、Borland C+ 5.5.1 (bcc32.exe)というものを使っているので、それを使う予定です. これで(仮に余裕があれば経験を積むために)幾何計算ライブラリを構築することはできるのかな.普通どのようにするのでしょうか.
3)そうでした.重要なことを忘れていました.ありがとうございます.コストが高い=計算が遅い、ってことですよね. プログラムを作った後で、結構大量の計算をする予定です.高速化のためのなんか良い作戦がないでしょうか. 値は0≦θ<2π, 0<φ<π/2をとり得るのですが. 一般論としては、高頻度の値については結果の表(テーブル)を用意する作戦がある、と聞いたことがあります.しかし、あらゆる値をとりうる場合には、あまり効果がなさそうです.普通に三角関数入りのプログラムを組むしか仕方ないとは思っています.なにかワザが有りましたら教えていただけましたら幸いです.

お礼日時:2001/05/19 20:28

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

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

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

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

Q直交する2直線

方程式2x^2-3xy+λy^2+5y+μ=0がxy平面上の直交する2直線を表すようにλ,μを定め、この2直線の方程式を求めよという問題なんですが、解き方、考え方が分かりません。
答は λ=μ=-2
  2x+y=2、2y-x=1 です。

直交する2直線が上方程式で表せれるということもよく分からないので、その辺りもよろしかったら教えてください。

Aベストアンサー

直線の式は ax+by+c=0 という風に表す、というのはOKですね。
与えられた式が(ax+by+c)(px+qy+r)=0 とできたとすると
ax+by+c=0 または px+qy+r=0 となり、2つの直線を表すことになります。
ここまでは、may-may-jpさんの回答の通りですが、ただ因数分解できるだけではλとμは特定できません。そこで必要になるのが「直交」の条件です。

直交する条件は2つの直線の傾きの積が-1になることです。
ax+by+c=0 を変形して y=(a/b)x+(c/b) ただし b≠0
同様に px+qy+c=0 を変形して y=(p/q)x+(r/q) ただし q≠0
とすると 傾きはそれぞれ a/b,p/qですか積が-1 すなわち
(a/b)・(p/q)=ap/bq = -1 ∴ ap = -bq が直交条件です。

なお、b=0(q=0)のときは直線はy軸に平行になります。このとき直交する直線はx軸と平行になり、xの係数が0 つまりp=0(a=0) になります。このときもap = -bq (=0)で成り立ちます。

さて(ax+by+c)(px+qy+r)=0 の左辺を展開すると
apx^2+bqy^2+(aq+bp)xy+(ar+cp)x+(br+cq)y+cr=0
となります。(途中の計算はご自分で確かめてください。)
ここで直交条件をみると x^2 とy^2の係数に注目すればよいことが分かります。
与式に戻って、2x^2-3xy+λy^2+5y+μ=0のx^2 とy^2の係数をみれば 2=-λ すなわちλ=-2が求められます。
これを代入して
2x^2-3xy+2y^2+5y+μ=0
これが(ax+by+c)(px+qy+r)=0 の形に因数分解できれば良いわけです。
x^2,y^2,xyの係数に注目すると
(2x+y+c)(x-2y+r)=0 --(*)という形になることは容易に分かります。
あとはx,yの係数から
2r+c=0
r-2c=5
の2式が出ますので、連立方程式を解いて
r=1, c=-2 よってμ=cr=-2
となります。
このrとcを(*)に代入すれば
(2x+y-2)(x-2y+1)=0 となり、直線の式は 2x+y-2=0,x-2y+1=0
と求まります。
答えの2x+y=2、2y-x=1 は上記の式の定数項を移行した形ですね。

直線の式は ax+by+c=0 という風に表す、というのはOKですね。
与えられた式が(ax+by+c)(px+qy+r)=0 とできたとすると
ax+by+c=0 または px+qy+r=0 となり、2つの直線を表すことになります。
ここまでは、may-may-jpさんの回答の通りですが、ただ因数分解できるだけではλとμは特定できません。そこで必要になるのが「直交」の条件です。

直交する条件は2つの直線の傾きの積が-1になることです。
ax+by+c=0 を変形して y=(a/b)x+(c/b) ただし b≠0
同様に px+qy+c=0 を変形して y=(p/q)x+(r/q) ただし...続きを読む

Q証明がわかりません。「与えられた直線の垂線を、直線の外に与えられた点から引くことができる。」 という

証明がわかりません。「与えられた直線の垂線を、直線の外に与えられた点から引くことができる。」
というのを証明しないといけないのですが、
「与えられた点をAとし、与えられた直線に対してAとは反対側に点Bをとる。Aを中心とし、ABを半径とする円を作り、」
から続きを書き始めるようにということでした。
何回かトライしてみたのですが、どのように手をつければいいのか全くわかりません・・
解説お願いします。

Aベストアンサー

No.3の者ですが訂正と解説を追記します。
三角形→△など記号では無いところは記号にしておいてください。

<解説>
 とりあえず垂線の作図と関連する問題なので、図1のように、中学校で習った作図と同じ様な図を書いてみて、各点に名前をつけます。「垂線が引けるか?」とは「ホントにこの作図で、∠AFCと∠AFDが90°になるのか?」を証明すればいい事がわかります。
そこで、もし∠AFCと∠AFDが等しければ、180÷2で90°になることを証明できそうです。

 ∠AFCと∠AFDが等しいことを証明するには、図1の黄色の三角形と赤色の三角形の合同を使えばいいことがわかります。、円の半径が等しいのでAC=ADだし、AFが共通だから証明しやすそうです。

 さて、黄色と赤の図形でAC=AB、AF=AFは簡単に言えそうです。あとひとつ条件があれば証明できそうです。そこで図2を見てください。AEが∠CADの二等分線になっている事がわかります。よって、∠AFC=∠AFDといえます。
※△ACE≡△ADEの証明からでも証明できます。


これで、二辺とその間の角が等しいので合同が証明でき、∠AFC=90°も証明できます。
 
以上をまとめたものがNo.3の回答となりますが、割りと簡略しているので質問者様の方で学校で習っている表現にしておいてください。

No.3の者ですが訂正と解説を追記します。
三角形→△など記号では無いところは記号にしておいてください。

<解説>
 とりあえず垂線の作図と関連する問題なので、図1のように、中学校で習った作図と同じ様な図を書いてみて、各点に名前をつけます。「垂線が引けるか?」とは「ホントにこの作図で、∠AFCと∠AFDが90°になるのか?」を証明すればいい事がわかります。
そこで、もし∠AFCと∠AFDが等しければ、180÷2で90°になることを証明できそうです。

 ∠AFCと∠AFDが等しいことを証明するには、図1の黄色の三角形と...続きを読む

Qxy平面において、原点Oを通り互いに直交する2直線

xy平面において、原点Oを通り互いに直交する2直線を引き、直線x=-1および直線x=3√3 との交点をそれぞれP、Qとする。 OP+OQの最小値を求めよ。

Aベストアンサー

原点Oを通り互いに直交する2直線をm,nとしましょうか。交点は4つある。
A: mとx=-1との交点
B: mとx=3√3との交点
C: nとx=-1との交点
D: nとx=3√3との交点
P, Qってどれだよ?というのがソモソモの疑問デスヨネ?
(1) OP+OQがOA+OBのことなのだとすると(直線nには出番がありませんが)、OA+OBの最小値が1+3√3であることは自明。
(2) OP+OQがOC+ODでも同じです。(直線mには出番がありませんで)最小値は1+3√3。
(3) OP+OQがOA+OCのことなのだとすると(直線x=3√3には出番がありませんで)、△OACは直角三角形である。明らかに、直角二等辺三角形の場合にOA+OCが最小になるんで、2√2が答。
(4) OP+OQがOB+OCのことだったら(直線x=-1には出番がありませんで)、(3)と比べて、直角三角形の各辺の長さが3√3倍になるだけなので、(2√2)×(3√3)が答である。
 残る問題は、
(5) OP+OQがOA+ODであるとき。(ま、出題者の意図は専らこれなんでしょうけど、はっきり書いてないと(1)~(4)も省けません。)
 交差する相手の直線を x=-1とx=3√3じゃなくて一般にx=a, x=b (a≠0, b≠0)だとしてみましょう。
 そして、mの方程式を ux + vy = 0 とすると、v=0の場合にはmはx=aともx=bとも交点を持たない。また、u=0の場合にはnがaともx=bとも交点を持たない。だから(5)においては、これらの場合は除外してよろしい。というわけで、mの方程式を
   y = αx (α≠0)
と書いても差し支えない。このときnの方程式は
  y = x/α
です。
  A= (a, aα)
  D= (b, b/α)
であり、原点からの距離は
  OA = |A| = |a|√(1+α^2)
  OD = |D| = |b|√(1+1/(α^2))
である。
OA+OD をfと書くことにすると、
  f = |A|+|D| = |a|√(1+α^2) + |b|√(1+1/(α^2))
である。ここで
  z = α^2
とおくと zは正の実数 (z>0)です。zを使って
  f = |a|√(1+z) +|b|√(1+1/z)
と書き直します。さて、fの極小値を計算する。つまり方程式
  df/dz = 0
を満たすzを計算するわけで、df/dzを計算して方程式に代入すると
  |a|/(2√(1+z)) - |b|/(z^2)/(2√(1+1/z)) = 0
移項して分母を払うと
  |a|(z^2)√(1+1/z) = |b|√(1+z)
両辺を2乗して
  (a^2)(z^4)(1+1/z) = (b^2)(z+1)
つまり
  (a^2)(z^3)(z+1) = (b^2)(z+1)
z>0なので(z+1)で割って
  (a^2)(z^3) = (b^2)
a≠0なので
  z^3 = (b/a)^2
である。ただし、zは正の実数でなくてはならないのでした。
 ところで、aとbは0でない実数でした。なので、a,bを決めるとこの方程式を満たすzはいつも丁度ひとつ存在して、それは
z = ((b/a)^2)の立方根
です。これを
  f = |a|√(1+z) +|b|√(1+1/z)
に代入するとfの極値、つまりfの極小値あるいはfの極大値が得られる。
 ですが、fの極値を与えるzがただ一つしかなくて、しかもz→0やz→+∞のときにfが+∞に発散するんですから、極大なんてそもそも存在しないのは明らか。なので、この計算でfの極小値が得られ、これがfの最小値でもある。

原点Oを通り互いに直交する2直線をm,nとしましょうか。交点は4つある。
A: mとx=-1との交点
B: mとx=3√3との交点
C: nとx=-1との交点
D: nとx=3√3との交点
P, Qってどれだよ?というのがソモソモの疑問デスヨネ?
(1) OP+OQがOA+OBのことなのだとすると(直線nには出番がありませんが)、OA+OBの最小値が1+3√3であることは自明。
(2) OP+OQがOC+ODでも同じです。(直線mには出番がありませんで)最小値は1+3√3。
(3) OP+OQがOA+OCのことなのだとすると(直線x=3√3には出番がありませんで)、△OACは直角三角形であ...続きを読む

Q数学の質問! 直線と中点

〔問題〕
xyz空間においてP(1,0,3)、Q(3,2,1)がある。
この時、直線PQを軸にして、X(4,0,5)を180度回転したとき、移動後の点の座標を求めよ。


2直線の中点が一致すればいいのですが、どうも合いません。
どこがおかしいんでしょうか?


>>P(1,0,3),Q(3,2,1),X(4,0,5)

求める点の座標をY(a,b,c)

(1+3)/2=(4+a)/2

(0+2)/2=(0+b)/2

(3+1)/2=(5+c)/2

よって、

a=0

b=2

c=-1

Y(0,2,-1)

で→PQ・→XY=0 となるはずなんですが、ならないんです。。。

教えてください!!

Aベストアンサー

>どこがおかしいんでしょうか?

線分PQの中点は、線分XYの中点とは何の関係もありませんよ。
したがって、
せっかく立てた以下の関係式は
>(1+3)/2=(4+a)/2
>(0+2)/2=(0+b)/2
>(3+1)/2=(5+c)/2

>よって、
>a=0
>b=2
>c=-1
>Y(0,2,-1)
3次元の図を描いて貼り付けますので各点の位置関係を確認してください。
図中点M'は線分PQの中点です。一方、XYの中点は点Mです。
点MはXから直線PQに下ろした垂線の足になります。これは線分PQの中点とは一致していないことが図から明らかでしょう。このように3次元のイメージを描いて考えないと、式を立てても間違いに気がつかないですね。連立方程式の解き方がいくら正しいかチェックしても、連立方程式そのものが間違っていたら何もならないですね。

連立方程式は、直線PQの方程式
(1+2s,0+2s,3-2s) …(1)(s媒介変数)
であることから線分XYの中点Mが直線PQ上にあることから
>(1+3)/2=(4+a)/2
1+2s=(4+a)/2 …(2)
>(0+2)/2=(0+b)/2
2s=(0+b)/2 …(3)
>(3+1)/2=(5+c)/2
3-2s=(5+c)/2 …(4)

また、直線PQと直線XYが直交することから
それぞれの方向ベクトルの内積=0となることから
(2,2,-2)・(a-4,b,c-5)=2(a-4)+2b-2(c-5)=0 …(5)

(2)~(5)を連立にして解けば
a=-4/3,b=2/3,c=1/3,s=1/6
と得られます。

なお、s=1/6を(1)に代入すれば線分XYの中点かつ垂線の足Mの座標が出てきます。

添付図を見ながら式の意味をよく理解し、また連立方程式を解いて図と見比べて見てください。

>どこがおかしいんでしょうか?

線分PQの中点は、線分XYの中点とは何の関係もありませんよ。
したがって、
せっかく立てた以下の関係式は
>(1+3)/2=(4+a)/2
>(0+2)/2=(0+b)/2
>(3+1)/2=(5+c)/2

>よって、
>a=0
>b=2
>c=-1
>Y(0,2,-1)
3次元の図を描いて貼り付けますので各点の位置関係を確認してください。
図中点M'は線分PQの中点です。一方、XYの中点は点Mです。
点MはXから直線PQに下ろした垂線の足になります。これは線分PQの中点とは一致していないことが図から明らかでしょう。このように3次元のイメ...続きを読む

Q2直線が直交するように、A,Bと交点の途中式を教えてください

2直線が直交するように、A,Bと交点の途中式を教えてください

(1) (x-3)/2 = (y+1)/-3 = (z-4)/A , (x+5)/3 = (y+6)/4 = z+B
A.A=6 B=4 交点(1,2,2)

(2) x+3 = (y-1)/2 = (z-7)/A , x/2 = (y-B)/5 = (z+2)/4
A.A=-3 B=7 交点(0,7,-2)

全く分かりません。例が参考にならないのでよろしくお願いします

Aベストアンサー

(1)
(x-3)/2 = (y+1)/-3 = (z-4)/A
の方向ベクトルは(2,-3,A)

(x+5)/3 = (y+6)/4 = (z+B)/1
の方向ベクトルは(3,4,1)
2つの方向ベクトルが直交するから内積=0
(2,-3,A)・(3,4,1)=6-12+A=0 ∴A=6

この時前半の直線は
(x-3)/2 = (y+1)/-3 = (z-4)/6(=kとおく)
媒介変数表現で
x=2k+3,y=-3k-1,z=6k+4…(1)

後半の直線は
(x+5)/3 = (y+6)/4 = (z+B)/1=h
とおけば媒介変数表現で
x=3h-5,y=4h-6,z=h-B…(2)

(1),(2)を連立方程式として解けば交点の座標(x,y,z)とBが求まります。
x=1,y=2,z=-2,B=4,k=-1,h=2
答えのA=6,B=4は合っていますが、交点の座標が正しくないようです。
正しい交点は(1,2,-2)です。
確認してみて下さい(元の直線の方程式に代入して式が成り立つかで分かります)。

(2)も同様の方法で出来ますのでやってみて下さい。

(1)
(x-3)/2 = (y+1)/-3 = (z-4)/A
の方向ベクトルは(2,-3,A)

(x+5)/3 = (y+6)/4 = (z+B)/1
の方向ベクトルは(3,4,1)
2つの方向ベクトルが直交するから内積=0
(2,-3,A)・(3,4,1)=6-12+A=0 ∴A=6

この時前半の直線は
(x-3)/2 = (y+1)/-3 = (z-4)/6(=kとおく)
媒介変数表現で
x=2k+3,y=-3k-1,z=6k+4…(1)

後半の直線は
(x+5)/3 = (y+6)/4 = (z+B)/1=h
とおけば媒介変数表現で
x=3h-5,y=4h-6,z=h-B…(2)

(1),(2)を連立方程式として解けば交点の座標(x,y,z)とBが求まります。
x=1,y=2,z=-2,B=4,k=-1,h=2
答えの...続きを読む

Q正四面体ABCDの頂点からおろした垂線と外接球の中心が同一直線上にある理由

辺の長さが3の正四面体ABCDの外接球の半径を求める数学の問題の解説で、
『外接球の中心をO、Aから底面BCDに下ろした垂線の足をHとしたとき
①AB=AC=AD
かつ②OB=OC=ODであるから対称性よりA、O、Hは同一直線上にある』
とあるのですが、①AB=AC=ADかつ②OB=OC=ODが言えると、なぜA、O、Hが同一直線上になるのかが分かりません。(感覚的にはわかるのですが…)

他の知恵袋等、インターネットで調べたところ、上記の対称性は回転対称性の事ではないか?という解答を見つけましたが、それはつまり
『①AB=AC=ADから言える事は、正四面体だから、各辺の長さが同じで、直角三角形の斜辺と他の一辺が等しいからBH=CH=DHとなりHは△BCDの外心と一致し、120°、240°と回転させると元の正四面体と重なる。
また、②OB=OC=ODから言えることは、Oは外接球の中心でありAOを軸に回転させると元の正四面体と重なる。』

という事であり、
結果、(正四面体の1つの頂点から考えて)同じように回転させて正四面体が一致する軸は1つしかなく、A、O、Hは同一直線上にあると言える、という理解で間違いないでしょうか?

また、正四面体の1つの頂点からの垂線上に、外接円の中心は存在するという事実は、問題を解く上で前提としても問題ないのでしょうか?

長く、分かりにくく申し訳ありません。ご回答、よろしくお願い致します。

辺の長さが3の正四面体ABCDの外接球の半径を求める数学の問題の解説で、
『外接球の中心をO、Aから底面BCDに下ろした垂線の足をHとしたとき
①AB=AC=AD
かつ②OB=OC=ODであるから対称性よりA、O、Hは同一直線上にある』
とあるのですが、①AB=AC=ADかつ②OB=OC=ODが言えると、なぜA、O、Hが同一直線上になるのかが分かりません。(感覚的にはわかるのですが…)

他の知恵袋等、インターネットで調べたところ、上記の対称性は回転対称性の事ではないか?という解答を見つけましたが、それはつまり
『①AB=AC=ADか...続きを読む

Aベストアンサー

あまり難しく考えずに, 外接球の中心 O を xyz 座標空間の原点に, A を z 軸上の正の部分に取り,
それに合わせて B, C, D の座標を定めてはどうでしょうか.
添付画像のとおりに見やすくするなら, B の x 座標は正で y 座標は負, としていいでしょう.
あとは数式計算により, H が z 軸上にあることを証明するだけです.

この問題は, ことばは悪いですが「ただの計算問題」なので,
対称性とか回転を本格的に調べるのは, 出題の趣旨から外れるような気がします.
計算問題ということを考えれば, A, O, H が同一直線上にあることに関しては,
「対称性」ということばだけ添えて言及すればよく, 証明せずに使っても減点されないと思います.

QFortranで直交座標から極座標変換のプログラム

Fortranで直交座標から極座標変換のプログラム

FDTD法を用いて、散乱電場を求める際、最初Ex(i,j,k), Ey(i,j,k), Ez(i,j,k)を求めましたが、
それから座標をr方向に座標変換したく、プログラムを作ろうと思っているのですが、どのように書いてよいのか悩んでいます。
単位ベクトル r = (x,y,z)=(sinθcosφ,sinθsinφ,cosθ)と定義できるのですが、これを
どのように極座標のプログラムとして書いてよいのかわかりません。
どなたかわかる方がいらっしゃたら教えて下さい。よろしくお願いします。

Aベストアンサー

座標変換(デカルト座標から極座標)に伴う単位ベクトルの変換またはベクトル成分の変換を行おうということなら下記URL参照。

参考URL:http://www-d.ige.solan.chubu.ac.jp/goto/docs/math/pm6.ssi

Q原点から直線におろした垂線の足の座標

「原点から直線
(x-p)/a=(y-q)/b=(z-r)/cへおろした垂線の足の座標を求めよ。」という問題です。

解いてみました・・・。
(x-p)/a=(y-q)/b=(z-r)/c=tとすると
x=at+p y=bt+q z=ct+r
∴この直線上の点Pは媒介変数tを用いて
P(at+p,bt+q,ct+r)とかける。
また、この直線の方向ベクトルvはv=(a,b,c)であるから
v*(op)=a(at+p)+b(bt+q)+c(ct+r)=0とおくと
a^2*t+ap+b^2*t+bq+c^2*t+cr=0
(a^2+b^2+c^2)t=-ap-bq-cr
t=(-ap-bq-cr)/(a^2+b^2+c^2)
x=at+p=a*{(-ap-bq-cr)/(a^2+b^2+c^2)}+p
={(b^2+c^2)p-a(bq+cr)}/(a^2+b^2+c^2)
同様に
y={(a^2+c^2)q-b(ap+cr)}/(a^2+b^2+c^2)
z={(b^2+a^2)r-c(bq+ap)}/(a^2+b^2+c^2)
となりましたが・・・。もっと式を簡単にできないのかな?

「原点から直線
(x-p)/a=(y-q)/b=(z-r)/cへおろした垂線の足の座標を求めよ。」という問題です。

解いてみました・・・。
(x-p)/a=(y-q)/b=(z-r)/c=tとすると
x=at+p y=bt+q z=ct+r
∴この直線上の点Pは媒介変数tを用いて
P(at+p,bt+q,ct+r)とかける。
また、この直線の方向ベクトルvはv=(a,b,c)であるから
v*(op)=a(at+p)+b(bt+q)+c(ct+r)=0とおくと
a^2*t+ap+b^2*t+bq+c^2*t+cr=0
(a^2+b^2+c^2)t=-ap-bq-cr
t=(-ap-bq-cr)/(a^2+b^2+c^2)
x=at+p=a*{(-ap-bq-cr)/(a^2+b^2+c^2)}+p
={(b^2+c^2)p...続きを読む

Aベストアンサー

ベクトルを使うと少しは簡単になります。

U=(p,q,r)
V=(a,b,c) とおくと
直線上の点Pは任意の実数tで
P=U+tV
とかけます。
(P=(x,y,z)として各成分についてt= の式にすれば証明できます)

Pが原点から直線に下ろした足の交点なら
P・V=0
が成り立ちます。
(図を描けばわかると思います。)

変形して
(U+tV)・V=0
t=(U・V)/(V・V)
よって
P=U+V*{(U・V)/(|V|^2)}
となります。

これを展開すれば同じ結果になると思います。
(注:めんどくさいので確認していません)

Q直線を描画するプログラム

初歩的ですみません。
マウスで始点と終点を決めて直線を書くプログラムを知っている方がおりましたら教えてください。

よろしくお願いします。

Aベストアンサー

WinTKというのは良く分からないんで、MFCの方を……
とりあえずダイアログアプリケーションで説明すると、

1.
 ダイアログベースのスケルトンを作ります
2.
 xxxDlg.h に座標を保持るためメンバを追加します。
class CxxxDlg : public CDialog
 {
   CPoint m_ptBegin, m_ptEnd;

3.
クラスウィザードで WM_LBUTTONUP, WM_RBUTTONUP を選択します。

4.
 void CxxxDlg::OnLButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に左ボタンが離された座標が入ってますので保持しておきます(始点)
   m_ptBegin = point;
   CDialog::OnLButtonUp(nFlags, point);
 }
5.
 void CxxxDlg::OnRButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に右ボタンが離された座標が入ってますので保持しておきます(終点)
   m_ptEnd = point;

   // 再描画します。
   InvalidateRect( NULL );

   CDialog::OnRButtonUp(nFlags, point);
 }

6.
 CxxxDlg::OnPaint()関数の以下の部分を変更します。

 else
 {
   CDialog::OnPaint();
 }
      ↓
 else
 {
   CPaintDC dc( this );

   dc.MoveTo( m_ptBegin );
   dc.LineTo( m_ptEnd );

   CDialog::OnPaint();
 }

と、大体こんな感じです。m_ptBegin, m_ptEndはコンストラクタで初期化してやっておいて
ください。説明が大雑把なんでわかりにくかったら言ってくださいね。

ほな。

WinTKというのは良く分からないんで、MFCの方を……
とりあえずダイアログアプリケーションで説明すると、

1.
 ダイアログベースのスケルトンを作ります
2.
 xxxDlg.h に座標を保持るためメンバを追加します。
class CxxxDlg : public CDialog
 {
   CPoint m_ptBegin, m_ptEnd;

3.
クラスウィザードで WM_LBUTTONUP, WM_RBUTTONUP を選択します。

4.
 void CxxxDlg::OnLButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に左ボタンが離された座標が入ってますので保...続きを読む

Q空間ベクトルで2点を通る直線をもとめたら文字が3つの式になりました。 これでも直線なんですか?

空間ベクトルで2点を通る直線をもとめたら文字が3つの式になりました。
これでも直線なんですか?

Aベストアンサー

直線ですよ。
3次元空間で座標を表すと、文字が3つ必要ですよね。
x方向にいくつ、y方向にいくつ、z方向にいくつ、と指定しているだけです。
平面の直線ではzを考えなくて良かったため、x方向とy方向の2つの文字で表せていただけですね。


人気Q&Aランキング

おすすめ情報