原子の発光スペクトル

 前期量子論(ぜんきりょうしろん、Old quantum theory)は、古典力学(統計力学)の時代から、ハイゼンベルクの行列力学、シュレーディンガーの波動力学等による本格的な量子力学の構築が始まるまで(1920年代中頃)の、過渡期に現れた量子効果に関しての一連の量子論的理論です。

ここでは原子の発光スペクトルの実験結果に対して提案されたリュードベリの公式について考えてみます。この公式は後にボーアの原子模型によって、エネルギー準位間の遷移にともなう吸光・発光現象として説明されます(ただし水素の場合のみ)。

課題1:リュードベリの式

 1888年、ヨハネス・リュードベリは、水素原子の放射線の波長𝜆に関する有名な公式を発表しました。

\[\frac{1}{\lambda} = R (\frac{1}{m^2} - \frac{1}{n^2})\]

 ここで \(R\) はリュードベリ定数 1.097 \(\times\) \(10^{-2} \text{nm}^{-1}\), \(m\)\(n\) は正の整数です。

 特定の\(m\)の値に対して、すべての \(n>m\) の式に対して\(\lambda\)が与えられます。

 最初の 3 つの系列は、発見者にちなんで名付けられたライマン系列、ベルマー系列、パッシェン系列として知られています。

 最初の 3 つの系列(m=1,2,3)について、最初の 5 つの波長を計算するコードを作成してください。

正しい結果は以下のようになります。

Series for m =  1
n= 2    121.5436037678517 nm
n= 3    102.55241567912488 nm
n= 4    97.23488301428137 nm
n= 5    94.95594044363415 nm
n= 6    93.76220862091418 nm
Series for m =  2
n= 3    656.3354603463993 nm
n= 4    486.1744150714068 nm
n= 5    434.084299170899 nm
n= 6    410.2096627164995 nm
n= 7    397.04243897498225 nm
Series for m =  3
n= 4    1875.2441724182836 nm
n= 5    1281.9051959890612 nm
n= 6    1093.8924339106654 nm
n= 7    1005.013673655424 nm
n= 8    954.6697605038536 nm

課題2:入力を受け取るプログラム

実行中に、ユーザーが入力した値で処理をさせるインタラクティブなプログラムを作成します。

input( ) は入力を受け取り、文字列として格納します。

[16]:
x=input("type a value for x: ")
y=input("type a value for y: ")
print('x+y=',x+y)
type a value for x:  1
type a value for y:  2
x+y= 12

ユーザーが整数を入力した場合、コードは文字列を整数に変換してから続行する必要があります。

[17]:
print(4+9)
print('4'+'9')
13
49

文字列を整数に変換するにはint( )を使います。

[18]:
#Is there anything wrong, how to fix it?
x=int(input("type a value for x: "))
y=int(input("type a value for y: "))
print('x+y=',x+y)
type a value for x:  1
type a value for y:  2
x+y= 3

リュードベリ方程式のプログラムをもう一度見てみましょう。

\[\frac{1}{\lambda} = R (\frac{1}{m^2} - \frac{1}{n^2})\]

ここで \(R\) はリュードベリ定数 1.097 \(\times\) \(10^{-2} \text{nm}^{-1}\), \(m\)\(n\) は正の整数です。

特定の\(m\)の値に対して、すべての \(n>m\) の式に対して\(\lambda\)が与えられます。

ユーザーが実行中に端末から m と n を入力するプログラムを作成してください。

正しい実行例は以下のようになります。

type a value for m: 1
type a value for n: 2
m= 1 , n= 2 , wavelength is 121.5436037678517 nm

課題3:エラー処理(条件分岐)

いままでのプログラムでは、 m と n に任意の値を割り当てることができます。

しかし正しい定義では、n は m よりも大きくなければなりません。

値が間違っている場合に、ユーザーに再入力させるにはどうしたら良いでしょうか。

  • If

if some_condition:
    do something
  • If-else

if some_condition:
    do something
else:
    do something else
  • if-elif-else

if some_condition:
    do case 1
elif some_condition:
    do case 2
else:
    do case 3
  • for loop

for variable in something:
    do something

    if something happens:
        break
  • While

while some_condition:
    algorithm
    something to break out the condition
  • Break

その名の通り。 ループ実行時に条件が真になったときにループから抜け出すために使用します。

  • Continue

これにより、残りのループが続行されます。 条件が満たされると、ループが終了する可能性があります。 これは、continue ステートメントを使用して回避できます。

Tips

1, 条件の文を書くときは必ず : で終わることに注意してください。

2, Pythonではインデントが必要です

値が間違っている場合に、ユーザーに再入力させるプログラムを作成してください。

正しい実行例は以下のようになります。

ケース1:n は m よりも小さいため計算しない
type a positive integer value for m: 4
type positive integer value greater than m for n: 3
n must be greater than  4 ,  please enter another number:
ケース2:入力値が負の値のため計算しない
type a positive integer value for m: -2
m must be positive integer, please enter another number:
ケース3:入力値が条件を満たしている
type a positive integer value for m: 1
type positive integer value greater than m for n: 2
m= 1 , n= 2 , wavelength is 121.5436037678517 nm

課題4:関数を使用する

プログラムでは同じステートメントが繰り返されます。

同じステートメントを何度も実行するのは、多くのメモリを消費するため効率的ではありません。

これを避けるために関数を定義することができます。

関数の基本的な構文は以下のようになります。

def funcname(arg1, arg2,... argN):

    ''' Document String'''

    statements

    return <value>

上記の構文は次のように読むことができます。

「funcname」という名前の関数が定義されており、引数「arg1,arg2,….argN」を受け入れます。

関数の機能は、’’’ Document String’’’ で説明すると良いでしょう。

ステートメントを実行した後の関数は、“value”を返します。

[19]:
#indexing
a = [1, 2, 4, 5, 5, 6, 8]
#print(a[0])
#print(a[3:-2])
[20]:
print(a)
len(a)
[1, 2, 4, 5, 5, 6, 8]
[20]:
7

上記のようなリストについて、最も大きな値を返す関数をmy_max( )として以下のように定義します。

[21]:
def my_max(lists):

    ans = lists[0]
    for i in lists:
        if ans<i:
            ans=i
    return ans

[22]:
print(my_max(a))
8

波長を計算する関数calc_lambda(m,n)を定義して、プログラムを書き換えてください。

正しい実行例は以下のようになります。

type a value for m: 1
type a value for n: 2
m= 1 , n= 2 , wavelength is 121.5436037678517 nm

ラムダ式

これは名前を定義せず、結果を返す小さな関数です。Lambda 関数は、リストを操作するときに非常に便利です。

この関数は、キーワード lambda の後に変数、コロン、および式が続くことによって定義されます。

[23]:
z = lambda x: x * x
[24]:
z(8)
[24]:
64