水素原子の基底状態解は原点での値を用いずに特徴付けられる

3次元空間における水素原子ハミルトニアンに対する固有値問題*1

\begin{equation}
-\dfrac{1}{2}\Delta \psi - \dfrac{1}{|x|} \psi = E \psi,\quad x \in \mathbb{R}^3
\end{equation}

について, 1s軌道に対応する基底状態解を考察します.

よく知られているように, 基底状態解は球対称であるため,
 u(|x|) = \psi(x) と変換することにより, 未知関数  u: [0,+\infty)\rightarrow \mathbb{C} についての方程式

\begin{equation}
\left(-\dfrac{1}{2}\dfrac{d^2}{dr^2} -\dfrac{1}{r}\dfrac{d}{dr} -\dfrac{1}{r}\right)u = E u,\quad r \in (0,\infty) \tag{1}
\end{equation}

と変形できます.
さらに, (1) に対して, 形式的(部分積分から出る境界項が消えるよう)に  r^2 \bar{\phi} をかけて部分積分することにより弱形式

\begin{equation}
\left\langle \dfrac{r}{2}\dfrac{du}{dr}, \dfrac{r}{2}\dfrac{d\phi}{dr}\right\rangle
- \left\langle \sqrt{r}u, \sqrt{r}\phi \right\rangle
=E \left\langle ru, r\phi\right\rangle \tag{2}
\end{equation}

を得ます.

本記事では, 1次元における固有値問題 (1) に焦点を当てて, 適当な関数空間での変分問題と見なすことで, 特に陽に境界条件を与えることなく基底状態解が得られることを解説していきます.

また, 本記事は有限要素法による数値計算について紹介している, dc1394さんの記事
qiita.com
についての考察を兼ねています.
モデリング数値計算の箇所を読んでいて, 境界条件を設定していないように見えるのに, 正しく基底状態解が得られていることが気になり調べてみました.
なお, 弱形式の導出などについても紹介記事にて丁寧に行われているため, 気になる方はそちらを参考にしてみてください.

*1:単に, シュレディンガー方程式とも呼びます

続きを読む

変分法の直接法で、ラプラシアンの第一固有関数と第一固有値を手に入れる

この記事では, 滑らかな有界領域  \Omega \subset \mathbb{R}^n に対して Dirichlet Laplacian の第一固有関数  u_1 と第一固有値  \lambda_1 を変分的な手法で得ます.
すなわち, 次の Dirichlet 条件付き楕円型偏微分方程式を満たす固有値  \lambda\in \mathbb{R} と固有関数  u=u(x) を求める問題を考えましょう.

\begin{equation}
\begin{cases}
- \Delta u = \lambda u, &\text{in } \Omega,\\
u = 0, &\text{on } \partial \Omega.
\end{cases}\tag{P}
\end{equation}

簡単のため, 固有値の中でも最小の第一固有値と, 第一固有関数に着目して解いていきます.

レイリー・リッツの特徴づけ

第一固有値  \lambda_1 は次のように特徴づけられる.
\begin{equation}
\lambda_1= \inf\left\{ \frac{\|\nabla v\|^2_2}{\| v\|^2_2} ;v\in H_0^1(\Omega)\setminus\{0\}\right\} \tag{M}
\end{equation}

ただし,  H_0^1(\Omega)ソボレフ空間,  \|\cdot\|_2 L^2 ノルムを表します.
以下では, まずはこの最小化問題が解を持つことを解説していき, 次いでその解がもとの固有値問題の解になっていることを述べます.

続きを読む

最適輸送「モンジュの問題」と「カントロビッチの問題」

最適輸送問題とは?

ある砂山の形  \mu を別の砂山の形  \nu に移すことを考える.
砂山の移動に掛かる労力が「質量」と「始点と終点の位置」で決まっているとき, トータルの労力が最小になるような移し方はどんなものだろうか?

数学的に定式化すると

砂がありえる場所の全体を領域  \Omega \subset \mathbb{R}^d として表し, 砂山の形をそれぞれ確率測度  \mu, \nu \in P(\Omega) で表し, 関数  c:\Omega\times\Omega \rightarrow [0,+\infty] として単位体積を始点から終点へ輸送したときの労力を表す.

モンジュの問題

次の最小化問題を満たす  T を見つけ出せ;
\begin{equation}
\inf\left\{\int c(x,T(x))\,d\mu(x)\,|\, T:\Omega\rightarrow\Omega :\text{可測}, T_{\#}\mu =\nu\right\}.
\end{equation}
ここで,  T_{\#}\mu
\begin{equation}
T_{\#}\mu(A) = \mu(T^{-1}(A)),\quad A\in \mathcal{B}(\Omega)
\end{equation}
で与えられる測度であり,  \mu T による押し出し (push forward) という.

また, この最小化問題の解  T は ( \mu から  \nu への) 最適輸送写像と呼ばれる.

カントロビッチの問題

次の最小化問題を満たす  \gamma を見つけ出せ;
\begin{equation}
\inf\left\{\int\int_{\Omega\times\Omega} c\,d\gamma\,|\, \gamma\in\Pi(\mu,\nu)\right\}.
\end{equation}
ここで,  \Pi(\mu,\nu)
\begin{equation}
\Pi(\mu,\nu) = \left\{ \gamma\in P(\Omega\times\Omega)\,|\, (\pi_1)_{\#}\gamma = \mu, (\pi_2)_{\#}\gamma = \nu\right\}
\end{equation}
により与えられる測度の族であり, この要素を ( \mu から  \nu への) 輸送計画と呼ぶ.
ただしここで,  \pi_1, \pi_2 はそれぞれ  \pi_1(A\times B) = A, \pi_2(A\times B) = B なる射影である.

また, この最小化問題の解  \gamma は ( \mu から  \nu への) 最適輸送計画と呼ばれる.

カントロビッチの問題は割と解ける

関数 c :X\times Y\rightarrow \mathbb{R}\cup \{+\infty\} が下に有界かつ下半連続であるとする.
このとき, カントロビッチの問題は解を持つ.

モンジュの問題が解けるならば, カントロビッチの問題の最適輸送計画はそれ以下のコストを持つ

輸送写像  T がモンジュの問題の解とすると,
\begin{equation}
\gamma_T = (\text{id}, T)_{\#}\mu
\end{equation}
 \gamma_T \in \Pi(\mu,\nu) により,
\begin{align}
\int c(x,T(x))\,d\mu(x)
&= \int\int_{\Omega\times\Omega} c(x,y)\,d\gamma_T(x,y)\\
&\ge \inf\left\{\int\int_{\Omega\times\Omega} c\,d\gamma\,|\, \gamma\in\Pi(\mu,\nu)\right\}.
\end{align}

モンジュの問題は解けないが, カントロビッチの問題は解ける場合がある

これを見るためには,
\begin{align}
\mu &= \delta_0,\\
\nu &= \dfrac{\delta_0 + \delta_1}{2},\\
c(x,y)&= |x-y|
\end{align}
の条件で, それぞれの問題を考察すればよい.
つまり,  0 にあった砂のうちの半分を  1 に輸送することを考える.
このとき, モンジュの問題は  T(0) の値がいずれであっても輸送写像が作れず, 一方でカントロビッチの問題は
\begin{equation}
\gamma(\{0\}\times \{0\}) = \gamma(\{0\}\times\{1\}) = 1/2
\end{equation}
となるようなものを取れば, これが最適輸送計画となる.

無限次元ヒルベルト空間の有界点列は収束部分列を持たないが、弱収束部分列なら持つ

この記事では, 無限次元ヒルベルト空間  H について,

  1. 有界な点列であっても収束するような部分列がない場合があること
  2. 弱収束を考えれば収束するような部分列があること

を述べていきます.

続きを読む

AGC044 の A 問題「Pay to Win」を Python で解いてみる

再帰を書くのが苦手です.
問題はこちら:
atcoder.jp

問題概要

次の選択肢を繰り返すことで初期値  0 N にするための最小コストを求めよ.

  • コスト  A を払うことで, 数値を  2 倍する
  • コスト  B を払うことで, 数値を  3 倍する
  • コスト  C を払うことで, 数値を  5 倍する
  • コスト  D を払うことで, 数値を  1 増やす
  • コスト  D を払うことで, 数値を  1 減らす

ただし, テストケースは  T 個ある

制約


\begin{align*}
&1\le T \le 10 \\
&1\le N\le 10^{18}\\
&1\le A,B,C,D \le 10^9
\end{align*}

続きを読む

L^2 で弱収束するが強収束しない関数列の3パターン

関数列が弱収束するのに強収束しない場合は, この記事で述べるような3パターンの例があります*1.
この記事では, 2乗可積分ルベーグ空間  L^2(\Omega) を対象とし*2,  0 に弱収束する関数の列  \{f_k\}_k \subset L^2(\Omega) の例*3を考えていきます.

例1. めっちゃ振動する

 L^2(0,\pi) における関数列  \{f_k\}_k \subset L^2(0,\pi) を,
\begin{equation}
f_k(x) = \sin{kx},\quad x \in (0, \pi)
\end{equation}
と定めると, 定数関数  0 に弱収束するが, 強収束しない.

例2. どこかに凝集する

 L^2(0,1) における関数列  \{f_k\}_k \subset L^2(0,1) を,
\begin{equation}
f_k(x) =
\begin{cases}
k ,\quad x \in \left(0, \dfrac{1}{k^{2}}\right],\\
0, \quad x \in \left(\dfrac{1}{k^{2}}, 1\right)
\end{cases}
\end{equation}
と定めると, 定数関数  0 に弱収束するが, 強収束しない.

例3. 無限遠へさまよう

 L^2(\mathbb{R}) における関数列  \{f_k\}_k \in L^2(\mathbb{R}) を,
\begin{equation}
f_k(x) =
\begin{cases}
1 ,\quad x \in \left(k, k+1 \right),\\
0, \quad otherwise
\end{cases}
\end{equation}
と定めると, 定数関数  0 に弱収束するが, 強収束しない.

これらの事実について述べます.

*1:もちろん考えている関数空間や領域に依ります

*2:指数  1 < p < \infty に対する  L^p(\Omega) 空間でも同様の例が作れます

*3: 0 でない場合は平行移動すればよい

続きを読む

ABC 162 A - Lucky 7 を Python で解いてみる

問題概要

atcoder.jp

3桁の数字が与えられたとき, 一度でも 7 があったら "Yes" を, そうでないなら "No" を出力せよ.

考えたこと

  • 100 の位の数字が 7 である
  • 10 の位の数字が 7 である
  • 1 の位の数字が 7 である

の3つの条件のいずれかが成り立てば"Yes"を出力すればよいことがわかります.
回答を行うには, 次の 2 つの手順が必要になります:

  • or 演算子を使って 3 つの条件をまとめる
  • if 文を使って条件が成り立つ場合とそうでない場合に分ける

また, 入力を 3 桁の数字としてではなく, 3文字の文字列として扱うことにしましょう.
こうすることで, 3 つの条件は,

  • 1文字目が '7' である
  • 2文字目が '7' である
  • 3文字目が '7' である

のようにそれぞれ書き表すことができます.

入力

入力を文字列として受け取りましょう.

N = input()

これで, 入力を変数  N に 3 文字の文字列として代入することができました.

出力

  • 3つの条件のどれかが成り立つならば, "Yes" を出力する
  • そうでないならば, "No" を出力する

により回答を行います.

if N[0] == '7' or N[1] == '7' or N[2] == '7':
  print("Yes")
else:
  print("No")

Submission #11861851 - AtCoder Beginner Contest 162