量子化学での運動量演算子とハミルトニアン演算子の違いはあるんでしょうか?違いがあるならシュレーディンガー方程式に作用させた時にどのような違いが出てくるか教えてください

A 回答 (2件)

的を射ていないかもしれません。



演算子とは波動関数への“質問”のようなものです。
波動関数は色々な情報を持っていますが、口数は多くありません。そこで各質問ごとに“演算子”という質問を与えるわけです。そうすれば、波動関数はハミルトニアン(言い換えれば“エネルギー演算子”)の場合であれば、“エネルギー”に関して話し、“運動量演算子”であれば“運動量”について話すわけです。
それが位置の二階微分とポテンシャルであったりするわけです。

これは、“量子力学”的で“量子化学”ではこんな考え方はあまりしないですね。

化学が専門のようなので、お勧めの教科書としてマッカーリ・サイモン物理化学がいいかもしれません。物理化学の教科書なのに、量子化学でなく量子力学していておもしろいです。
    • good
    • 0

運動量演算子をp,ポテンシャルをV(x)とするとハミルトニアン演算子Hは,(質量をmとして)


H=p^2/(2m)+V(x)
のようになるので,異なるものです.

違いは波動関数を作用させると,運動量が得られるものが,運動量演算子,エネルギーが得られるものがハミルトニアン演算子になります.
シュレディンガー方程式にはハミルトニアン演算子が入っているので,さらに作用させると,なんだかよくわからないものになります.定常状態のシュレディンガー方程式はエネルギーをEとして
Eφ=Hφ
となりますので,確かにハミルトニアン演算子が入っています.
詳しくは量子力学の教科書をご覧下さい.
    • good
    • 0

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

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

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

Q挿入演算子<<をオーバーロードについて

はじめまして。
質問があります。

class Foo {
・・・
// NG
friend ostream& operator<< (const ostream& out , Foo& c);
・・・
};

挿入演算子<<をオーバーロードするとき、挿入演算子関数の第1引数をconst ostream& outのようにconstを修飾するとコンパイルエラーに
なります。私としては、outの状態を変更したくないという意味
で修飾したのですが、なぜコンパイルエラーになるのかがわかりません。どうかご教授お願いします。
現在、Visual C++ 2005 Express Editionを使用しています。

Aベストアンサー

>コメントアウトして実行してみたところ、コンパイルエラーが
>でなくなりました。outはやはり、変更されているのですね。
蛇足ですが、コンパイラは out が変更されるかどうかをチェックしているのではなくて、あくまでその宣言に const 指定がないことを見てエラーとしています。

したがって、本当は内容を変更していない hoge(ostream& out) を operator<<(const ostream& out, Foo& c) の実装中に使ってもエラーになります。
逆に、Foo の定義されたネームスペースの中で operator<<(const ostream& out, const std::string&) 等が定義されていれば、そっちを使うのでエラーにはなりません。

Q量子力学において運動量を微分演算子に代える物理的意味

量子力学をきちんと物理的,数学的に理解したいので,独学で量子力学を勉強しています.学部時代は量子力学の授業がなかったこともあり,正直分からないことだらけで不思議に思うことがたくさんあります.

そのうちの一つとして,ある原子内の電子群を考え,ハミルトニアンHを持つ系だとすると,波動関数Ψの絶対値の二乗(存在確率)で存在する原子内にある一つの電子は,あるエネルギ準位(固有値)εしか取り得ないという考え方をシュレディンガー方程式
HΨ=εΨ
で表される固有値問題に帰着するということをとりあえず納得したとすると,線型代数学で出てくる固有値問題
Ax↑=λx↑
のように「ある固有ベクトルx↑に対してある固有値λが決まる」
ということと似ているのでなんとなく分かります.

波動方程式からシュレディンガー方程式を導出していくこともなんとなく分かりました.分からないことは,シュレディンガー方程式の導出として,ハミルトニアンを波動関数に作用させ,ハミルトニアン中に含まれる運動量を微分演算子に代えれば,シュレディンガー方程式になっているということです.この方法は,結果として成り立つだけで,後付けくさいなあと感じました.

過去にも同じような質問をされていた方
http://oshiete1.goo.ne.jp/qa587812.html
がいましたので見てみると,運動量を微分演算子に代えるのは数学的には導けるようですが,その導く過程が物理的には分かりにくいと感じました.

量子力学を勉強する前に基礎知識が不十分なのもあるとおもいます.
なので,量子力学を勉強する前に習得するべき学問は何かと,どの順番で勉強すれば効率がよいかも教えていただきたいです.

(1)量子力学において,運動量を微分演算子に代えることの物理的意味は?もっと一般的に,その他の物理量(角運動量,スピン角運動量など)を演算子に代えることの物理的意味は?
(2)量子力学を勉強する前に習得するべき学問は何かと,それらをどの順番で勉強すれば効率がよいか?
です.長くなりましたが,よろしくお願いいたします.

量子力学をきちんと物理的,数学的に理解したいので,独学で量子力学を勉強しています.学部時代は量子力学の授業がなかったこともあり,正直分からないことだらけで不思議に思うことがたくさんあります.

そのうちの一つとして,ある原子内の電子群を考え,ハミルトニアンHを持つ系だとすると,波動関数Ψの絶対値の二乗(存在確率)で存在する原子内にある一つの電子は,あるエネルギ準位(固有値)εしか取り得ないという考え方をシュレディンガー方程式
HΨ=εΨ
で表される固有値問題に帰着するということを...続きを読む

Aベストアンサー

行列形式を学習されていないのでしたら、ぜひ先ほどの解析力学の本を
よんだ後に、
「現代の量子力学 上下」J.J.サクライ 吉岡書店
を読まれることをお薦めします。

http://www.amazon.co.jp/%E7%8F%BE%E4%BB%A3%E3%81%AE%E9%87%8F%E5%AD%90%E5%8A%9B%E5%AD%A6%E3%80%88%E4%B8%8A%E3%80%89-%E7%89%A9%E7%90%86%E5%AD%A6%E5%8F%A2%E6%9B%B8-%E6%A1%9C%E4%BA%95-%E7%B4%94/dp/4842702222

そうすれば、シュレーディンガー方程式が天下りではなく、きわめて
自然な流れの中で導出されます。
この流れで学習すれば、化学系や工学系でよくある授業の形式である
ド・ブロイの物質波->シュレーディンガー方程式
という流れで感じる天下りによるもやもやが解消されます。
光や電子の粒子性と波動性の二面性というものもい後者の流れでは
うやむやのままですが、前者の流れでは明確な形で説明されます。

行列形式を学習されていないのでしたら、ぜひ先ほどの解析力学の本を
よんだ後に、
「現代の量子力学 上下」J.J.サクライ 吉岡書店
を読まれることをお薦めします。

http://www.amazon.co.jp/%E7%8F%BE%E4%BB%A3%E3%81%AE%E9%87%8F%E5%AD%90%E5%8A%9B%E5%AD%A6%E3%80%88%E4%B8%8A%E3%80%89-%E7%89%A9%E7%90%86%E5%AD%A6%E5%8F%A2%E6%9B%B8-%E6%A1%9C%E4%BA%95-%E7%B4%94/dp/4842702222

そうすれば、シュレーディンガー方程式が天下りではなく、きわめて
自然な流れの中で導出されます。
この流れで学...続きを読む

Q+演算子オーバーロード

こんにちは。お世話になっております。

// +演算子オーバーロード
CPoint CPoint::operator+(CPoint& obj) //~(1)
{
CPoint tmp;
tmp.m_x = m_x + obj.m_x;
tmp.m_y = m_y + obj.m_y;
return tmp;
}
int main()
{
CPoint point1( 100, 150 );
CPoint point2( 200, 50 );

std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl;
point1 = point1 + point2; // オーバーロードされた+演算子が呼び出される
std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl;
point1 += point2; // オーバーロードされた+=演算子が呼び出される
std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl;
return 0;
}
某サイトで上のようなサンプルプログラムがあるのですが
これはc++で書かれた「+演算子オーバーロード」の定義で、動作としては
「point1 = point1.operator+( point2 ); // point1 = point1 + point2; と同じ」というような動作です。
それで疑問が出てきたのですが、イコールの右側で足す数が↓のような3つの場合、ans = a + b + c;です。
これだと(1)のところの引数を2つをとる関数を別に作らないとだめでしょうか?それとも、ans = ((a + b) + c);というふうに優先順位で自動的に計算してくれる+演算子オーバーロードのプログラムを教えてくれませんか?↑式のカッコは便宜上付けただけで、出来ればans = a + b + c;だけで計算出来るプログラムを教えてください。

こんにちは。お世話になっております。

// +演算子オーバーロード
CPoint CPoint::operator+(CPoint& obj) //~(1)
{
CPoint tmp;
tmp.m_x = m_x + obj.m_x;
tmp.m_y = m_y + obj.m_y;
return tmp;
}
int main()
{
CPoint point1( 100, 150 );
CPoint point2( 200, 50 );

std::cout << "x:" << point1.getx() << "y:" << point1.gety() << std::endl;
point1 = point1 + point2; // オーバーロードされた+演算子が呼び出される
std::cout << "x:" << point1.getx() << "y:" << point1.gety()...続きを読む

Aベストアンサー

CPoint CPoint::operator+(CPoint& obj)
ひとつ用意すれば
連続して3つでも4つでも、いくつでも加算可能です。

Q運動量演算子とエルミート演算子

証明の仕方が全くわからないため質問させていただきます。

運動量演算子が-ihバー∂/∂xであるとき、-ihバー∂/∂xがエルミート演算子であることを示せ。

上述の問題を解いていただけたら幸いです。
できれば詳しく論述もお願いします。

Aベストアンサー

A =-i∂/∂x として、

<f|A†|g>=<g|A|f>*=<f|A|g>

となることことを証明すれば良い訳です。ただし、hバーは定数なので省きました。それ故、f(x)とg(x)はヒルベルト空間に属する任意の関数として、

(1) <f|A|g>= ∫dx f*(x)(-i∂/∂x)g(x)

一方、

(2) <g|A|f>*= [ ∫dx g*(x)(-i∂/∂x)f(x) ]*

ですから、(2)を変形して、それが(1)に等しいことが言えれば証明終わりです。この証明は部分積分をすれば出来ます。ただしその時、f(x)とg(x)がヒルベルト空間の要素であるという条件から、積分の境界でそれらがゼロになるという事実を使います。

以上。

Qoperator演算子のnewオーバーロード

こんばんは。
C++言語の勉強をしています。
new演算子をオーバーロードしたいのですが、引数としてvoid*を渡したかったのですが、
エラーC2821が出力されてできませんでした。
エラー内容が第一引数がsize_tでなければならない理由が分からない
ので質問しました。

ご教授お願いします。

Aベストアンサー

演算子の場合、少々特殊な事情がありますから。

たとえば、演算子 new は、

Foo *aFoo = new foo();

という形の使い方をします。
これを、内部的には、

Foo *aFoo = new(sizeof(Foo));

という形で呼び出します。
というわけで、普通の関数は、定義したそのままの形で使いますが、演算子の場合、ソース上の記述と、それを、オーバーロードされた関数としてみたときの形が異なります。

new の場合、上記のように変形されることを前提として使用しますから、最初の引数は、size_t でないと困るわけです。

Qシュレーディンガー方程式 演算子

シュレーディンガー法式でポテンシャル、V=0とし、運動エネルギーの演算子K(x)=-A(d^2/dx^2)と運動量の演算子を求めれます。
この事で質問なのですが、V=0の時に導出した運動エネルギー、運動量の演算子をポテンシャルがゼロでない時の波動関数に作用させて、得られた固有値がそれぞれの物理量になるとしてもいいのでしょうか?それとも、ポテンシャルがゼロでない時には、また別の運動エネルギー、運動量の演算子が存在するのでしょうか?
ご回答よろしくお願いします。

Aベストアンサー

>V=0の時に導出した運動エネルギー、運動量の演算子をポテンシャルがゼロでない時の波動関数に作用させて、得られた固有値がそれぞれの物理量になるとしてもいいのでしょうか?

そうです。それでよいと思います。

>それとも、ポテンシャルがゼロでない時には、また別の運動エネルギー、運動量の演算子が存在するのでしょうか?

別の運動エネルギー、運動量の演算子は存在しません。

Q->*演算子のオーバーロードについて

こんにちは。質問させてください。

現在下記のような処理(main関数でやっているような処理)を実現させたいのですが、うまくコンパイルできません。

#include <iostream>

class Test
{
public:
  void TestFunc()
  {
    std::cout << "TestFunc" << std::endl;
  }
};

class AllowOverLoad
{
public:
  Test* operator ->()
  {
    return new Test;
  }
};

int main()
{
  void ( Test::*lpTestFunc )() = &Test::TestFunc;

  AllowOverLoad overload;
  ( overload->*lpTestFunc )();
}

主なエラーは
error C2296: '->*' : 無効です。左オペランドには型 'AllowOverLoad' が指定されています。
です。

おそらくこの問題を解決するにはAllowOverLoadに->*演算子をオーバーロードしなくてはいけないと思うのですが、->*演算子のオーバーロード方法がいまいちよくわかりません。
いい文献やHPも見つけられなかったので質問させていただきました。

/*
現在、本番のコーディングでは暗黙的なキャストを禁止しているのでAllowOverLoadクラスに暗黙的にTest*型にキャストするような処理はなしの方向で、あくまで->*演算子のオーバーロードということでお願いします。

Microsoft WindowsXP Professional Edition
VisualStudio 2008 AcademicEdition
*/

よろしくお願いします。

こんにちは。質問させてください。

現在下記のような処理(main関数でやっているような処理)を実現させたいのですが、うまくコンパイルできません。

#include <iostream>

class Test
{
public:
  void TestFunc()
  {
    std::cout << "TestFunc" << std::endl;
  }
};

class AllowOverLoad
{
public:
  Test* operator ->()
  {
    return new Test;
  }
};

int main()
{
  void ( Test::*lpTestFunc )() = &Test::TestFunc;

  AllowOverLoad overlo...続きを読む

Aベストアンサー

確かに自分も悩んだ. 結局規格を読んで解決したんだけど.
operator->* は 2項演算子で, a->*b は a.operator ->*(b) と解釈されます. 今の例では overload->*lpTestFunc が overload.operator ->*(lpTestFunc) と解釈されるので, クラス AllowOverLoad に
operator ->*(void (Test::*func)())
を定義する必要があります.
また, この演算子の返り値も注意する必要があります. 返した値を直接関数呼び出しとして使うためには
・「普通の」関数 (へのポインタ) を返す
・operator () がオーバロードされたクラスのオブジェクトを返す
のどちらかが必要になります. ところが, static でないメンバ関数への . 等を使った参照は「ただちに関数呼び出しを行う」ことしかできません. 従って, operator ->*(void (Test::*func)()) では「operator () をオーバロードしたオブジェクトを返す」という作業をしなければなりません. 全体として, 例えば
#include <iostream>

class Test {
public:
void testFunc() { std::cout << "TestFunc" << std::endl; }
};

class Funcall {
public:
Funcall(Test *ptr, void (Test::*func)()) : ptr_(ptr), func_(func) { }
void operator ()() const { return (ptr_->*func_)(); }

private:
Test *ptr_;
void (Test::*func_)();
};

class AllowOverload {
public:
Funcall operator ->*(void (Test::*func)()) { return Funcall(new Test, func);
}
};

int main()
{
void (Test::*lpTestFunc)() = &Test::testFunc;

AllowOverload ovl;
(ovl->*lpTestFunc)();

return 0;
}
とすることで所与の目的を果たすことができます.
とはいえ, 本当にオーバロードが必要なんでしょうか?

確かに自分も悩んだ. 結局規格を読んで解決したんだけど.
operator->* は 2項演算子で, a->*b は a.operator ->*(b) と解釈されます. 今の例では overload->*lpTestFunc が overload.operator ->*(lpTestFunc) と解釈されるので, クラス AllowOverLoad に
operator ->*(void (Test::*func)())
を定義する必要があります.
また, この演算子の返り値も注意する必要があります. 返した値を直接関数呼び出しとして使うためには
・「普通の」関数 (へのポインタ) を返す
・operator () がオーバロードされたクラ...続きを読む

Q作用反作用と運動量保存則

すみません、一度この題目で質問したんですが質問の仕方があまりにテキトウでした汗
 作用反作用の法則を運動量保存則で記述する(抗力などつりあいの反作用は分子の衝突の運動量保存則で理解)というEMANさんのサイトhttp://homepage2.nifty.com/eman/dynamics/contents.htmlをみて疑問に思ったんですが、張力の場合、どう運動量保存則で記述できるんでしょうか?

Aベストアンサー

 
 
>> 作用反作用の法則を運動量保存則で記述するという <<

 歴史的なニュートンの3法則は、現代的には「運動量保存則」という1つのパンを3つに割って、個々の性質を説明してるようなものです。 第1(慣性の法則)は 運動量保存則がハッキリ見えやすい舞台設定(座標系)の話です。 第2(F=ma運動方程式)は運動量の時間微分は力であると語ってますが、大胆な話、速度や加速度だけで話を進めればこの第2は使わなくて済みます。 第3(作用反作用)は もし2物体の衝突だとするなら 運動量の平行成分だけしか言ってません(*)。もし2物体が電荷を有してれば力の向きは 互いを結ぶ方向と一致しないので「向きは正反対」も普遍的ではありません。
(*;平行成分しか言ってないし垂直成分が保存されると言ってないこと、などいろいろあって現在は第3イコール運動量保存則とは言わないのが通例です。 いろいろあってニュートンは後にさらに1つ「力は平行四辺形に分解できる」を法則として追加して4つにしたりの試行錯誤が続いたようです。)

 3つに分けて個々に味付け(例を挙げて説明)したものばかり食べてると、脳が肥満して、3つが1つのものだという悟りに達しません。我々凡人にはボトムアップ修行は難しいです。 そこで 運動量保存則そのものを食べるように食習慣を変えましょう。やがて脳が慣れてこだわりが消えると 全貌が客観的に見えてきます。



 石を押しても動かない、ゆえに物理的仕事はゼロ、だが体感的には大汗かいて仕事した気分だ、という事について。
 これは人間の筋肉が力を出すメカニズムが「電磁石が力を出すためには電池内で化学反応がどんどん起きないといけない」のと同様の構図だからです。エネルギはどちらも熱に。人間は大汗。 錆びついた電磁石に電池をつないでも電磁石は動かないが 電池はエネルギを失います。(なお、実際の筋肉繊維のメカニズムは電磁力でなく静電気力らしいです、たとえばコンデンサに電荷を与えると極板に力が発生します。)

>> でつりあう力(実際疲れるのにエネルギーにならないからおかしいと思ってました。)である抗力も張力も分子の運動量になるということで理解したのですがそれで大丈夫ですか? <<

 上記のモデルを参考に自分流のモデルを考えてみてください。これはじっくり考える価値があり、理解を深めるのにとてもいい題材です。こういう事で人から答を聞くのはもったいないですよ。



余談;
 天秤が左右つり合ってるとします。じつは歴史的に、運動量=mV という考えはこれを説明するために、ガリレイ曰く「もし動いたとすれば腕の長い方の速度が大きいゆえ、仮想的な速度は腕の長さLに比例する。」これから「腕の長さL×力F」も派生。同じモーメントという名でまぎらわしいのはこの歴史的経緯によります。 ガリレイ続けて「釣り合わないのはmと動いたときの速度Vの積が左右で異なるから。mVすなわちmLの違いが『うごく動機、きっかけ』である。」いまいちよく分からないけど これが動機=モメンタム=日本語で運動量 の起源だそうです。 現在の定義とは違うんですね。


 あのサイトが始まった頃作者はどこかのQAサイトで記事の質問に答えてましたね、今は止めたんでしょうか。一般にネット上での説明は予想外の副作用というか、受け取られ方が様々ですね。その頃どこかの理系掲示板があのサイトをサカナにしてたら、作者が話を聞きに現れて、書き直してました。力の釣り合いだったか、全ての力の源は運動量とは言えないだったか、ご質問の話題に近かった記憶があります。私は後日ログで見ただけでしたが。


>> (抗力などの反作用は分子の衝突の運動量保存則で理解) <<
流体の抗力
http://oshiete1.goo.ne.jp/kotaeru.php3?q=908588
 
 

 
 
>> 作用反作用の法則を運動量保存則で記述するという <<

 歴史的なニュートンの3法則は、現代的には「運動量保存則」という1つのパンを3つに割って、個々の性質を説明してるようなものです。 第1(慣性の法則)は 運動量保存則がハッキリ見えやすい舞台設定(座標系)の話です。 第2(F=ma運動方程式)は運動量の時間微分は力であると語ってますが、大胆な話、速度や加速度だけで話を進めればこの第2は使わなくて済みます。 第3(作用反作用)は もし2物体の衝突だとするなら 運動量の平行成分だ...続きを読む

Qnew演算子のオーバーロードについて

#include <stdio.h>
#include <windows.h>

class MyNew
{
public:
void* ptr;

MyNew( void* p )
{
ptr = p;
}

void* MyNew::operator new( size_t size )
{
printf("new-\n");
return malloc( size );
}

void MyNew::operator delete( void* ptr )
{
printf("delete-\n");
free( ptr );
}
};


void main( void )
{
MyNew p = new int;
}

クラスのメモリ確保をnew演算子のオーバーロードを用いて書いてみたのですがオーバーロードしたnew演算子が呼ばれません。
なぜでしょうか?

/**
VisualStdio2005コンソールアプリケーション
WindowsXP
*/

Aベストアンサー

MyNew::operator new を使うのは、「new でクラス MyNew (やそれを継承しながら独自に operator new を定義していないクラス) のオブジェクトを作るとき」です。今の例では「new で作っているオブジェクト」が int ですから、MyNew::operator new ではなく ::operator new が使われます。
これに対し
MyNew *p = new MyNew(new int); // #2
だと
・int 型のオブジェクトを作るときに ::operator new が、
・MyNew 型のオブジェクトを作るときに MyNew::operator new が
それぞれ呼び出されます。
MyNew::operator delete を呼ぶ時も同じで、「MyNew (とそれを継承しているが独自に operator delete を定義していないクラス) のオブジェクト (へのポインタ) を delete するときに呼び出されます。つまり上の #2 の場合に
delete p;
を実行すると、MyNew::operator delete が実行されます。

MyNew::operator new を使うのは、「new でクラス MyNew (やそれを継承しながら独自に operator new を定義していないクラス) のオブジェクトを作るとき」です。今の例では「new で作っているオブジェクト」が int ですから、MyNew::operator new ではなく ::operator new が使われます。
これに対し
MyNew *p = new MyNew(new int); // #2
だと
・int 型のオブジェクトを作るときに ::operator new が、
・MyNew 型のオブジェクトを作るときに MyNew::operator new が
それぞれ呼び出されます。
MyNew::op...続きを読む

Q作用反作用と運動方程式の関係を教えてください。

作用反作用の法則を考えていたら、静止していたら
加速度も0だから、F=mα より 力F も 0 ですよね。
なのに、机に置いてある物体は力Fで机を押していると
教えている。

運動方程式は加減速があるときにだけ適用されて、加減速
でしょうか。この質問は単純すぎるのでしょうか。

Aベストアンサー

No.7ですが、疑問に答えきれていませんでしたね。

力は観測者には見えません。
見えなくて当たり前。
見えないものを実験よって得られる関係式や法則という形で知ることができます。(これは自然を説明するという行為)
力を別の物理量から知ることができるということです。


>>目の前の静止した物体を見て、例えば重力の方向で無くて、水平方向の釣り合った力の存在を
>>知ることは出来ないと思ってしまうのです。これが謎なのです。

つまり実験ではどうかということですね?
人間が見て全部わかるというものなら研究者なんかとっくに廃業しています。
色々な関係式を使ったりアイデアを出したりして知っていくだけです。
例えば原子核くらいの大きさくらいの距離でしか感じられない強い力と弱い力なんかいくらを見ていても知ることはできない。
いろいろな実験によってやっと知ることができたもの。


人気Q&Aランキング

おすすめ情報