特殊相対性理論・電磁気学・数学

物理の暗黒面や面白い問題など。

G(x,y)=x²+y²-12≦0 のもとで、F(x,y)=x³-y³+3(x-y)² の最大最小を求む

2019-11-28 21:03:21 | 解析(極値)

1. まえがき

 G(x,y)=x²+y²-12≦0 のもとで、F(x,y)=x³-y³+3(x-y)² の最大最小を求む、という問題があっ
 た。計算がとても面倒だった。

2. 計算

 極値の判定は面倒なので、有界閉領域には必ず最大・最小が存在し、微分可能な関数では、最大・
 最小は極値にもなるから、求めた停留点の候補から、F(x,y)の最大・最小を選べばよい。
 まず、G(x,y)=x²+y²≦12 の内部と境界で別々に検討する。

 2.1 内部、G(x,y)<0

  内部の停留点はF(x,y)を微分して
  Fx=3x²+6(x-y)=0, Fy=-3y²-6(x-y)=0 から 6(x-y) を消して、x²=y² → y=±x をえる。
  これを再度 Fx=0 に入れると、x=0 or x(x+4)=0  → x=0 or x=-4 をえる。さらに、Fx=0
  にいれると、x=y=0 or x=-4, y=4 を得る。

  後者の候補は、G(x,y)
<0 を満たさず、領域外なので、内部の候補は
     F(0,0)=0・・・・・・・・①
  のみとなる。

 2.2 境界、G(x,y)=0


  境界の停留点はラグランジュの乗数法を使う。
     Fx-λGx=3x²+6(x-y)-λ2x=0, Fy-λGy=-3y²-6λ(x-y)-λ2y=0・・・・・②
  2つの式を加えて 6λ(x-y) を消すと 3x²-3y²-2λ(x+y)=0 → (x+y)(3(x-y)-2λ)=0  →
     y=-x or 2λ=3(x-y)・・・・・・・③
  を得る。前者は G(x,y)=0 に入れて
     x=±√6 , y=∓√6 (複合同順)
  を得る。このとき、
     F(±√6,∓√6)=±6³/²-(∓6³/²)+3(±√6-(∓√6))²=±2・6³/²+12・6
            =±12√6+72・・・・・・④
  ③の後者は➁の前者に入れてλを消すと
     2(x-y)+xy=0 → x=2y/(y+2)
  となる。これを G(x,y)=0 に入れて、xを消すと
     y⁴+4y³-4y²-48y-48=0 → (y²-2y-4)(y²+6y+12)=0
  となるが、y²+6y+12=(y+3)²+3>0 なので、解は y²-2y-4=0 となる。これは
     y=1±√(1+4)=1±√5
  をえる。G(x,y)=0 に入れると
     x²=6∓2√5=1∓2√5+5=(1∓√5)² → x=±(1∓√5)
  をえる。まとめると
     x=±(1∓√5) , y=1±√(1+4)=1±√5 (複合同順)
  である。このとき、
     (1±√5)³=1+3(±√5)²+3(±√5)+(±√5)³=1+15±3√5±5√5=16±8√5
  なので、
     F((1∓√5),1±√5)=60∓16√5・・・・・・⑤
     F(-(1∓√5),1±√5)=F(-1±√5,1±√5)=-20・・・・⑥
  となる。

  以上の、①➃⑤⑥の中から最大・最小を選ぶと
     最大・・・・F(√6,-√6)=12√6+72 (>60+16√5)
     最小・・・・F(-1±√5,1±√5)=-20 (複合同順)
  となる。

以上


級数 (1+1/n)ⁿ の単調増加と (1+1/n)ⁿ⁺¹ の単調減少の証明

2019-11-18 23:31:36 | 解析(極限・数列)

1. まえがき

 a[n]=(1+1/n)ⁿ は単調増加数列、b[n]=(1+1/n)ⁿ⁺¹ は単調減少数列であることを示す。
 a[n]の性質は、a[n] の収束の証明とと e の定義に使われている。

2. 計算

   a[n]={(n+1)/n}ⁿ だから
   a[n+1]/a[n]={(n+2)/(n+1)}ⁿ⁺¹{n/(n+1)}ⁿ={n(n+2)/(n+1)²}ⁿ⁺¹ (n+1)/n
                      ={1-1/(n+1)²}ⁿ⁺¹ (n+1)/n>{1-1/(n+1)}(n+1)/n=1
 したがって、a[n+1]>a[n] だから、単調増加数列となる。ここで、後で述べるベルヌーイの
 の不等式を使った。

   b[n]={(n+1)/n}ⁿ⁺¹ だから
   b[n]/b[n+1]={(n+1)/n}ⁿ⁺¹{(n+1)/(n+2)}ⁿ⁺²={(n+1)²/n(n+2)}ⁿ⁺² n/(n+1)
                      ={1+1/n(n+2)}ⁿ⁺² n/(n+1)>{1+1/n}n/(n+1)=1
 したがって、b[n]>b[n+1] だから、単調減少数列となる。ここで、後で述べるベルヌーイの
 の不等式を使った。   

3. 別の証明

 a[n]の方は別の証明が知られている。

 (1) a[n]の証明(2項定理から)
    a[n]=Σ[k=0,n] nCk (1/n)^k=Σ[k=0,n] n(n-1)・・・(n-k+1)(1/n)^k/k!

      =Σ[k=0,n] (1)(1-1/n)・・・(1-(k-1)/n)/k!
      >Σ[k=0,n-1] (1-1/n)・・・(1-(k-1)/n)/k!

  ここで、1-1/n>1-1/(n-1) だから
    a[n]>Σ[k=0,n-1] {1-1/(n-1)}・・・{1-(k-1)/(n-1)}/k!=a[n-1]
  なお。この方法は、b[n]の単調減少を証明には使えなかった。

 (2) a[n]の証明(AM-GM不等式から)
    (a[n+1])¹/⁽ⁿ⁺¹⁾=(n+2)/(n+1)=[{(n+1)/n}n+1]/(n+1)
  ここで n個の (n+1)/n と1個の1に、AM-GM不等式を使うと
     ≧[{(n+1)/n}ⁿ・1]¹/⁽ⁿ⁺¹⁾=[{1+1/n}ⁿ]¹/⁽ⁿ⁺¹⁾=a[n]¹/⁽ⁿ⁺¹⁾
  両辺を (n+1)乗すれば a[n+1]≧a[n] を得る。

 (3) b[n]の証明(AM-GM不等式から)
  b[n]={(n+1)/n}ⁿ⁺¹ を 1/b[n]={n/(n+1)}ⁿ⁺¹ として、議論する。
      (n+1)/(n+2)=[ {n/(n+1)}(n+1)+1 ] / (n+2) > [{n/(n+1)}ⁿ⁺¹・1]¹/ⁿ⁺²
  2番目の式は、(n+1)個の{n/(n+1)}と1個の1の(n+2)平均である。
等号は、
  n/(n+1)=1 の時なので成立しない。両辺を(n+2)乗して

            1/b[n+1]={(n+1)/(n+2)}ⁿ⁺² > {n/(n+1)}ⁿ⁺¹=1/b[n] → a[n]>a[n+1]

4. ベルヌーイの不等式

 x>0、nを自然数とすると
   xⁿ≧n(x-1)+1・・・・・①
 が成立する。xⁿ-1=(x-1)(xⁿ⁻¹+xⁿ⁻²+・・・+x+1) だから
   x≧1のとき、 (x-1)≧0 で (xⁿ⁻¹+xⁿ⁻²+・・・+x+1)≧1+1+・・・+1=n
   0<x<1のとき、(x-1)<0 で、(xⁿ⁻¹+xⁿ⁻²+・・・+x+1)<1+1+・・・+1=n
 したがって、
   xⁿ-1=(x-1)(xⁿ⁻¹+xⁿ⁻²+・・・+x+1)≧n(x-1)
 ゆえに、①が証明された。等号が成り立つのは x=1のとき。
 なお、0<x<1 のときは、①において x → 1-x (>0) として
   (1-x)ⁿ>1-nx  (0<x<1)・・・・②
 を得る。また、二項定理からも
   (1+x)ⁿ>1+nx  (0<x)・・・・・③
 が明らか

以上


C言語、ポインタアドレスの変更の注意

2019-11-12 10:26:05 | プログラム・PC

1. まえがき

 ひさしぶりに、プログラムしてみたら、大ボケしてしまった。

2. 問題

 整数値を格納する配列を受け取り,配列に格納された整数値のなかの最大値を示す配列のポイン
 タをポインタ変数 pmaxに格納する関数、setMax を作成し、この関数を呼び出し、動作するプ
 ログラムを作成する。

3. プログラム

 データが配列、 data[]に格納され、データ数をn、data[]の中の最大値を示すポインタを変数
 pmax に格納する。

 はじめ、呼び出しを「 if (setMax(data, N, pmax) == 0)」、関数を
 「int setMax(int data[], int n, int *pmax)」として、うまくいかなかった。何故かというと
 呼び出しで、変数pmaxに格納されているある変数のポインタ(指定されていないのでゴミ)を
 渡し、関数
の中では、そのポインタが示す場所の値を配列の最大値を示すポインタに変更してい
 た。


 正しくは、変数pmaxの場所を示すポインタ(アドレス)を渡して、その場所の値を書き換えな
 ければならなかった。


/* プログラム */
#include <stdio.h>

#define N 10

/* データ配列 data[]、データ数n、ポインタ変数のアドレス(ポインタ) ppmを受取り */
/* data[]の中の最大値を計算し、そのポインタをppmに返す */
int setMax(int data[], int n, int **ppm)
{
  int i, pos;

  if (n<1) return -1;
  pos=0;
  for (i=1; i<n; i++)
    if (data[i] > data[pos]) pos=i;

  *ppm=&data[pos];
  // printf(" data=%d,%d pos=%d\n", data[pos], **ppm, pos);
  return 0;
}

/* メイン */
int main()
{
  int data[N]={5,4,6,8,2,3,1,9,10,7};
  int *pmax;

  if (setMax(data, N, &pmax) == 0)
    printf("max : %d\n", *pmax);
  else
    printf("data error\n");

  return 0;
}

4. あとがき

 このようなプログラムは普通、書かない。呼び出し側でデータ配列は分かっているから、配
 列の添え字を返せばよく、このような誤りも無い。

 なお、デバックはあるサイトで行った、標準入力に制限があるようだが簡単なプログラムに
 は便利のようだ。

以上


級数を使って積分を求める方法

2019-11-06 19:35:07 | 解析(積分)

1. まえがき

 EMAN氏の掲示板で級数を使って積分を求める方法が載っていた。その簡単な例を紹介する
 (掲示板がダウンして閉鎖されてしまったので詳しい手順がわからなくなった)。


2. ∫[0→∞]{log(x+1)}²/x² dx =π²/3

  I=∫[0→∞]{log(x+1)}²/x² dx (log(1+x)=tと変換)
   =∫[0→∞] t²e^(-t)/(1-e^(-t))² dt

   1/(1-1-e^(-t))=Σ[m=0→∞] e^(-mt) (t>0 で、e^(-t)<1)
   1/(1-1-e^(-t))²=Σ[m=0→∞] (m+1)e^(-mt) (級数の積公式)
 から

  I=∫[0→∞] t²e^(-t) Σ[m=0→∞] (m+1)e^(-mt) dt
   =Σ[m=0→∞](m+1)∫[0→∞] t² e^(-(m+1)t) dt
   =Σ[m=0→∞]{1/(m+1)²}∫[0→∞] x² e^(-x) dx ( x=(m+1)tと変換)

 公式から ∫[0→∞] x² e^(-x) dx=Γ(3)=2!=2

  I=2Σ[m=0→∞]{1/(m+1)²}=2ζ(2)=π²/3


 3. I=∫[0→1] log x/(x²-1) dx=π²/8

 変数変換 log x=-y すると

  I=∫[0→1] log x/(x²-1) dx=∫[0→∞] ye^(-y)/(1-e^(-2y)) dy
 y>0 で e^(-2y)<1 から 1/(1-x)=1+x+x²+x³+・・・を使って
  I=∫[0→∞] y{e^(-y)+e^(-3y)+e^(-5y)+e^(-7y)+・・}dy
   =1+1/3²+1/5²+1/7²+・・・

 ここで、 ∫[0→∞] ye^(-ny)dy=1/n² を使った。
 つぎに、ツェータ関数から
  A=1+1/2²+1/3²+1/4²+1/5²+1/6²+1/7²+・・・=π²/6
 がわかっている。すると
  B=1/2²+1/4²+1/6²+1/8²+・・・
    =(1/2²)(1+1/2²+1/3²+1/4²+・・・)=A/4=π²/24

 ゆえに、
  I=1+1/3²+1/5²+1/7²+・・・=A-B=π²/6-π²/24=π²/8
 を得る。

 この計算は、解析入門Ⅱ、杉浦に留数を使って面倒な計算によって求めている。
  J=∫[0→∞] log x/(1-x²) dx= -π²/4
 を留数で求めたあと、 x → 1/x と変数変換を使って
  K=∫[1→∞]log x/(x²-1) dx=∫[0→1]log x/(x²-1) dx
 がわかる。この両辺を足したものは上の -Jである。つまり -J=2K
 したがって、
  K=∫[0→1]log x/(x²-1) dx=-J/2=π²/8

以上