担当授業のこととか,なんかそういった話題。

主に自分の身の回りのことと担当講義に関する話題。時々,寒いギャグ。

十進 BASIC で連立 1 次方程式を解く。(続)

2020-06-29 00:46:18 | Weblog
~前回までのあらすじ~

十進 BASIC で3元3立 1 次方程式を解くプログラムを完成させた私は,成功に気を良くし,基本変形のコマンドの仕様を変更したプチ改良バージョンを作ろうと企むのであった―。

はい,こんにちは!

前回は基本変形のコマンドの仕様を,

第 i 行に第 j 行の k 倍を加える:
1,ri,rj,k

第 i 行を k 倍する:
2,ri,k

第 i 行と第 j 行を入れ替える:
3,ri,rk

のように,わざわざ基本変形の種類に応じて先頭の数字(識別子)を手で入力するという方針にしたが,このように,コマンドに注文を付けるとプログラミングは楽になるが,実際の使い勝手を犠牲にするという trade-off の関係がある。

つまり,機械にやさしい仕様にするか,使用者にやさしい仕様にするかのせめぎ合いである。

今回は少しユーザフレンドリーに,先頭の識別子を付けずに済むコマンド形式を採用することにした。

きちんと仕様を詰めてアルゴリズムをしっかり設計してからプログラミングしたのではなくて,プログラミングをしながら考えるという,一番やってはいけない手順で組んだプログラムなので,IF 文の動きがわけわからなくなってきて,GOTO 文に頼り始めるというとても危ない状態に陥っている。電気回路でいえばスパゲッティ配線に相当する。要はデバッグや保守がやりづらい形態になってしまったのである。そのへんの brush up はいつかちゃんとやりたいものである。

内部副プログラムとか,同じような手続きをまとめてモジュール化するようなまっとうな設計思想できれいなコードを書いてみたいものである。そのあたりは今後の大きな課題である。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

十進 BASIC で連立 1 次方程式を解く。

2020-06-28 04:33:27 | mathematics
十進 BASIC 「に」連立 1 次方程式を「解かせる」のではない。

電卓のように,十進 BASIC 「で」連立 1 次方程式を「解く」のである。

もちろん,フルオートで連立 1 次方程式を解くプログラムを作ることはできるし,再帰的な繰り返し処理の手ごろな演習になりそうなのでぜひやってみたいところでもある。

けれども,本記事の趣旨は,手計算では計算ミスが多発する掃き出し計算の労苦を肩代わりしてくれる電卓的なプログラムを作るところにある。

前回の投稿記事で,十進 BASIC の有理数モードを利用して,その長年(?)の夢をようやく実現できたという報告を書いた。

今回は,講義中において学生に演示することを企図し,そのプログラムを問題の係数行列と基本変形のコマンドを入力していくインタプリタ版へと改造してみた。

係数行列の入力方法としては,MAT INPUT 文というとても便利そうなコマンドの使用も検討したが,次のような理由で今回は見送った。

MAT INPUT 文で PROMPT オプションがあるかどうかはヘルプを見てもわからなかったが,他の INPUT 文について書かれた説明を参考に

LET K=1
MAT INPUT PROMPT "第" & STR$(K) & "行の成分を入力して下さい:" :A

のようなプログラムを試したところ,ちゃんと機能することが確認できた。

ただし,この例として挙げた各行ごとの成分の入力を促す雰囲気を醸した PROMPT メッセージは意味がなく,MAT INPUT 文を使用した場合は行列 A の成分を一度にすべて入力しなければならない。

むしろ逆にそっちの方が使い勝手が良さそうな気もするが,まずは1行ごとに成分入力を促していくスタイルを試してみることとした。

なお,計算終了のコマンドは "0" で,"-1" と入力すると係数行列のデータはそのままで,掃き出し計算だけを最初からやり直せるようにしてある。

こうしてみると,行列 A の成分を入力するところからのやり直しもできるようにした方がより使い勝手は良くなりそうにも思える。

まあ,このあたりは Undo や Redo の機能を持たせて使い勝手をより良いものにしていくという,ユーザビリティ向上の話であって,「とりあえず期待通りに動いた!わあい!」というレベルからするともっと先の課題である。そうしたこだわりは今回は見送った。

それにしても,「こういう機能のアプリがあったらいいな」と夢想し,ググってみてもうまく探し出せないとき,

無いのなら 作ってしまおう ホトトギス

という工学精神で所望のものが作れるのがプログラミングの魅力であろう。

そして,それを実現する作業は大変だが,楽しい。

今回の件をクリアしたおかげで,命令が

LOAD, STORE, SUBTRUCT, JUMP MINUS, STOP

の5種類しかない,おそらく最も貧弱なアセンブラ言語のシミュレータ(エミュレータ?)を作るというここ数年胸に抱いている夢の実現へ向け,大きな一歩を踏み出せたように思う。

解きたい方程式の未知数の個数 n を入力して下さい:n=3
方程式の本数 m を入力して下さい:m=3
拡大係数行列の第1行の成分を入力して下さい:1,2,-2,5
拡大係数行列の第2行の成分を入力して下さい:1,3,-2,7
拡大係数行列の第3行の成分を入力して下さい:-1,-2,5,-2
解きたい方程式の拡大係数行列は
 1                       2                      -2                       5 
 1                       3                      -2                       7 
-1                      -2                       5                      -2 

基本変形のコマンドを入力して下さい:1,r2,r1,-1
第 2 行に第 1 行の -1 倍を加える;
 1                       2                      -2                       5 
 0                       1                       0                       2 
-1                      -2                       5                      -2 

基本変形のコマンドを入力して下さい:1,r3,r1,1
第 3 行に第 1 行の 1 倍を加える;
 1                       2                      -2                       5 
 0                       1                       0                       2 
 0                       0                       3                       3 

基本変形のコマンドを入力して下さい:2,r3,1/3
第 3 行を1/3 倍する;
 1                       2                      -2                       5 
 0                       1                       0                       2 
 0                       0                       1                       1 

基本変形のコマンドを入力して下さい:1,r1,r3,2
第 1 行に第 3 行の 2 倍を加える;
 1                       2                       0                       7 
 0                       1                       0                       2 
 0                       0                       1                       1 

基本変形のコマンドを入力して下さい:1,r1,r2,-2
第 1 行に第 2 行の -2 倍を加える;
 1                       0                       0                       3 
 0                       1                       0                       2 
 0                       0                       1                       1 

基本変形のコマンドを入力して下さい:0
これですべて(方程式は)解けた!


今回のソースコードも参考に挙げておく。
なお,GOTO 文を三か所で使用したが,使わずに済ませる方法があるかどうか,考えていない。

REM 有理数の範囲で 3元3立1次方程式を基本変形のコマンドを与えながら解く。
OPTION ARITHMETIC RATIONAL
REM 解きたい連立方程式の拡大係数行列 を A(m,n),
REM そのコピーを B(m,n) とする。
REM 計算用の補助配列として行ベクトル C(n) を用意しておく。
INPUT PROMPT "解きたい方程式の未知数の個数 n を入力して下さい:n=":Unknown
INPUT PROMPT "方程式の本数 m を入力して下さい:m=":Equations
DIM A(Equations,Unknown+1)
DIM B(Equations,Unknown+1)
DIM C(Unknown+1)
REM 拡大係数行列の成分は整数値で与えられるものとする。
FOR K=1 TO Equations
   LINE INPUT PROMPT "拡大係数行列の第" & STR$(K) & "行の成分を入力して下さい:": ROW$
   FOR KK=1 TO Unknown
      LET POSC=POS(ROW$,",")
      LET A(K,KK)=VAL(ROW$(1:POSC-1))
      LET ROW$=ROW$(POSC+1:LEN(ROW$))
   NEXT KK
   LET A(K,Unknown+1)=VAL(ROW$)
NEXT K
100 PRINT "解きたい方程式の拡大係数行列は"
    MAT PRINT A
    REM 拡大係数行列の成分を元データ A から計算用の配列 B へとコピーする。
    FOR m=1 TO Equations
       FOR n=1 TO Unknown+1
          LET B(m,n)=A(m,n)
       NEXT n
    NEXT m
    REM 基本変形のコマンドの書式は次の通り。
    REM コマンドの最初の数字は基本変形の種類の識別子である。
    REM "1,rI,rJ,L": 第 I 行に第 J 行の L 倍を加える。
    REM "2,rI,L": 第 I 行を L 倍する。
    REM "3,rI,rJ": 第 I 行と第 J 行を入れ替える。
    REM "0": 計算を終了する。
    REM "-1": 基本変形を最初からやり直す。
200 LINE INPUT PROMPT "基本変形のコマンドを入力して下さい:":S$
    REM 第 I 行に第 J 行の L 倍を加える
    IF S$(1:1)="1" THEN
       LET I=VAL(S$(4:4))
       LET J=VAL(S$(7:7))
       REM 文字列ロンダリング (laundering)。
       REM 係数 L を文字列から数値に変換する
       LET SUBS$=S$(9:LEN(S$))
       LET FRAC=POS(SUBS$,"/")
       IF FRAC=0 THEN
          LET L=VAL(SUBS$)
       ELSE
          LET NUMERATOR=VAL(SUBS$(1:FRAC-1))
          LET DENOMINATOR=VAL(SUBS$(FRAC+1:LEN(SUBS$)))
          LET L=NUMERATOR/DENOMINATOR
       END IF
       FOR n=1 TO Unknown+1
          LET C(n)=L*B(J,n)
          LET B(I,n)=B(I,n)+C(n)
       NEXT n
       PRINT "第";I;"行に第";J;"行の ";S$(9:LEN(S$));" 倍を加える;"
       REM 第 I 行を L 倍する
    ELSEIF S$(1:1)="2" THEN
       LET I=VAL(S$(4:4))
       REM 係数 L を文字列から数値に変換する
       LET SUBS$=S$(6:LEN(S$))
       LET FRAC=POS(SUBS$,"/")
       IF FRAC=0 THEN
          LET L=VAL(SUBS$)
       ELSE
          LET NUMERATOR=VAL(SUBS$(1:FRAC-1))
          LET DENOMINATOR=VAL(SUBS$(FRAC+1:LEN(SUBS$)))
          LET L=NUMERATOR/DENOMINATOR
       END IF
       FOR n=1 TO Unknown+1
          LET B(I,n)=L*B(I,n)
       NEXT n
       PRINT "第";I;"行を";S$(6:LEN(S$));" 倍する;"
    ELSEIF S$(1:1)="3" THEN
       LET I=VAL(S$(4:4))
       LET J=VAL(S$(7:7))
       FOR n=1 TO Unknown+1
          LET C(n)=B(I,n)
          LET B(I,n)=B(J,n)
          LET B(J,n)=C(n)
       NEXT n
       PRINT "第";I;"行と第";J;"列を入れ替える;"
    ELSEIF S$(1:1)="0" THEN
       GOTO 300
    ELSEIF S$(1:1)="-" THEN
       PRINT "掃き出し計算をやり直します。"
       GOTO 100
    END IF
    MAT PRINT B
    GOTO 200
300 PRINT "これですべて(方程式は)解けた!"
 END
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

やはりまずは十進 BASIC で。

2020-06-28 01:57:02 | mathematics
私が唯一使えるプログラミング言語は十進 BASICだけである。
そして十進 BASIC は独自拡張として有理数計算を実装している。
実は Julia に手を出すより前に十進 BASIC の利用を検討したのだが,配列にデータを自動的に読み込ませる,とても便利な MAT READ 文というコマンドでは,有理数をデータとして扱えないという大問題があった。
もう少しちゃんと事情を説明すると,例えば -2/3 という有理数は,データとして読み込ませる際には数値データとして扱うことはできず,文字列データ扱いにしかならないのである。

そうすると,文字列 "-2/3" をどうやって数値の -2/3 として計算に使用できるようにすればよいのか。

この問題の解決法がわからず,絶望し,Julia に浮気したというわけである。

有理数の計算を行うプログラムを自分で作るというのが解決策と思えたが,それにじっくり取り組む時間も今は取れそうにない。
そもそも十進 BASIC があらかじめサポートしてくれている有理数計算をわざわざ自前でプログラミングするというのも無駄なような気がする。
なんとか十進 BASIC の機能を活かせないものか・・・?

諦めきれないまま,とりあえず掃き出し計算の基本変形のコマンドの書式を考案し,そのコマンドの parsing(構文解析)もどきを具体的にどう実装するか,プログラムを考えてみた。

プログラミングの経験はこれまでほとんどなく,特に文字列の操作はどんなプログラミング言語であろうと基本中の基本と思われるが,関数(コマンド)が何種類もあって覚えきれないと感じ,食わず嫌いで敬遠してきた。

そのツケを払うときが来たのだ。

この構文解析もどきのプログラムを文字列操作関数を用いてどう実現するか,十進 BASIC の詳しくてとても便利なヘルプを眺めて考えていたら,

あ,文字列として分数を "/" を区切りに分子と分母にバラして,改めて (分子の数値) / (分母の数値) という形で有理数として十進 BASIC に与えたらいいんじゃね?

とひらめいた。

つまり,S$="-2/3" という文字列の状態の有理数を,"/" という記号のある位置を
LET P=POS(S$,"/")
でまず突き止め,S$ の第1文字から "/" の一つ前の文字までが分子を表す文字列なので,文字列を数値に変換する VAL 関数で数値に変換し,
LET BUNSHI=VAL(S$(1:P-1))
とおく。同様に,S$ の "/" の次の文字から最後の文字までが分母を表す文字列なので,「最後の文字の番号 = 文字列 S$ の長さ」であることから,文字列の長さを返す LEN 関数も用いて
LET BUNBO=VAL(S$(P+1:LEN(S$)))
とおき,最後に
let X=BUNSHI/BUNBO
とおくと,無事に X は数値としての -2/3 として十進 BASIC に認識されるようになる。

こうして,文字列 "-2/3" を数値 -2/3 に "ロンダリング (laundering)" する方法を思い付き,まずは S$="45/9" とおいて上の手続きで X=45/9 となるようにしたところ,
PRINT X
の実行結果が約分された形の 5 となった。

これに勢いを得て,コンピュータに基本変形のコマンド・リストを与えて掃き出し計算をさせる,というここ数年来の夢を叶える大きな一歩を踏み出すに至った。
今回の件で,文字列操作アレルギーもだいぶ薄れたように思う。
あとはファイル操作アレルギーの治療が必要だな・・・。

ちなみに,三年か四年前に,LIGHTS OUT という有名なパズルゲームを行列を利用して解くプログラムをやはり十進 BASIC で作ったことがあった。
その際,確かコマンドの parsing もどきはやった記憶があるが,1 ビットの 0 と 1 の和の計算しか行わずに済むため,分数を扱う必要がなく,今回ほど深刻な困難は明るみにならなかったのである。
その時作ったプログラムは手元に残っているかどうか調べていないが,そういえば
「第 i 行に第 j 行を加える」のを add(i,j),
「第 i 行と第 j 行を入れ替える」のを exchange(i,j)
とか名付けた記憶がほうふつとしてきた。

有理係数のみの連立 1 次方程式を,こちらの与えた基本変形のコマンド・リストに従って step by step に解くプログラムを作りたい,というのはその頃からの夢だったのである。

さて,私の拙いプログラムを恥ずかしげもなく以下に公開しておく。
明らかな無駄も含まれているが,そこは大目に見ていただきたい。

私と同じようなことを夢見ていながら果たせないままでいる,この世のどこかにいるかもしれない同志にとって,いくらかでも助けになれば本望である。

REM 有理数の範囲で 3元3立1次方程式を掃き出し法で解く。
OPTION ARITHMETIC RATIONAL
REM 解きたい連立方程式の拡大係数行列 を A(m,n),
REM そのコピーを B(m,n) とする。
REM B(m,n) は正直必要なかった・・・。
REM 計算用の補助配列として行ベクトル C(n) を用意しておく。
DIM A(3,4)
DIM B(3,4)
DIM C(4)
REM プログラム中に基本変形のコマンドを入れておく。
DIM S$(5)
REM 拡大係数行列の成分は整数値で与えられているものとする。
REM ファイルから読み込むようにしたいところである。
DATA 1,2,-2,5,1,3,-2,7,-1,-2,5,-2
REM --- 方程式 ---
REM x+2y-2z=5
REM x+3y-2z=7
REM -x-2y+5z=-2
MAT READ A
PRINT "拡大係数行列は"
MAT PRINT A
REM 基本変形のコマンド・リスト。
REM 事前に手で解いてコマンドを明らかにしておく。
REM コマンドの書式は次の通り。
REM コマンドの最初の数字は基本変形の種類の識別子である。
REM "1,rI,rJ,L": 第 I 行に第 J 行の L 倍を加える。
REM "2,rI,L": 第 I 行を L 倍する。
REM "3,rI,rJ": 第 I 行と第 J 行を入れ替える。
REM こちらもファイルから読み込むようにしたいところである。
LET S$(1)="1,r2,r1,-1"
LET S$(2)="1,r3,r1,1"
LET S$(3)="2,r3,1/3"
LET S$(4)="1,r1,r3,2"
LET S$(5)="1,r1,r2,-2"
REM 拡大係数行列の成分を元データ A から計算用の配列 B へとコピーする。
REM この作業は別に必要無かった・・・。
FOR m=1 TO 3
   FOR n=1 TO 4
      LET B(m,n)=A(m,n)
   NEXT n
NEXT m
FOR k=1 TO 5
   REM 第 I 行に第 J 行の L 倍を加える
   IF S$(k)(1:1)="1" THEN
      LET I=VAL(S$(k)(4:4))
      LET J=VAL(S$(k)(7:7))
      REM 文字列ロンダリング (laundering)。
      REM 係数 L を文字列から数値に変換する
      LET SUBS$=S$(k)(9:LEN(S$(k)))
      LET FRAC=POS(SUBS$,"/")
      IF FRAC=0 THEN
         LET L=VAL(SUBS$)
      ELSE
         LET NUMERATOR=VAL(SUBS$(1:FRAC-1))
         LET DENOMINATOR=VAL(SUBS$(FRAC+1:LEN(SUBS$)))
         LET L=NUMERATOR/DENOMINATOR
      END IF
      FOR n=1 TO 4
         LET C(n)=L*B(J,n)
         LET B(I,n)=B(I,n)+C(n)
      NEXT n
      PRINT "第";I;"行に第";J;"行の ";S$(k)(9:LEN(S$(k)));" 倍を加える;"
      REM 第 I 行を L 倍する
   ELSEIF S$(k)(1:1)="2" THEN
      LET I=VAL(S$(k)(4:4))
      REM 係数 L を文字列から数値に変換する
      LET SUBS$=S$(k)(6:LEN(S$(k)))
      LET FRAC=POS(SUBS$,"/")
      IF FRAC=0 THEN
         LET L=VAL(SUBS$)
      ELSE
         LET NUMERATOR=VAL(SUBS$(1:FRAC-1))
         LET DENOMINATOR=VAL(SUBS$(FRAC+1:LEN(SUBS$)))
         LET L=NUMERATOR/DENOMINATOR
      END IF
      FOR n=1 TO 4
         LET B(I,n)=L*B(I,n)
      NEXT n
      PRINT "第";I;"行を";S$(k)(6:LEN(S$(k)));" 倍する;"
   ELSEIF S$(k)(1:1)="3" THEN
      LET I=VAL(S$(k)(4:4))
      LET J=VAL(S$(k)(7:7))
      FOR n=1 TO 4
         LET C(n)=B(I,n)
         LET B(I,n)=B(J,n)
         LET B(J,n)=C(n)
      NEXT n
      PRINT "第";I;"行と第";J;"列を入れ替える;"
   END IF
   MAT PRINT B
NEXT k
PRINT "これですべて(方程式は)解けた!"
END


参考までにこのプログラムの実行結果も載せておく。

拡大係数行列は
 1                       2                      -2                       5 
 1                       3                      -2                       7 
-1                      -2                       5                      -2 

第 2 行に第 1 行の -1 倍を加える;
 1                       2                      -2                       5 
 0                       1                       0                       2 
-1                      -2                       5                      -2 

第 3 行に第 1 行の 1 倍を加える;
 1                       2                      -2                       5 
 0                       1                       0                       2 
 0                       0                       3                       3 

第 3 行を1/3 倍する;
 1                       2                      -2                       5 
 0                       1                       0                       2 
 0                       0                       1                       1 

第 1 行に第 3 行の 2 倍を加える;
 1                       2                       0                       7 
 0                       1                       0                       2 
 0                       0                       1                       1 

第 1 行に第 2 行の -2 倍を加える;
 1                       0                       0                       3 
 0                       1                       0                       2 
 0                       0                       1                       1 

これですべて(方程式は)解けた!
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で有理数の行列計算

2020-06-23 00:31:50 | mathematics
行列の計算を初めて習ったばかりの大学1年生を対象に,1つの 3×4 行列に,8 つの 3×3 行列を掛け算させる鬼のレポート課題を出そうかと思案中であるが,出題者側の自分自身が,面倒でその積の計算をやる気になれない。
自分もやりたくないような作業を学生に押し付けるなどもってのほかという気がするが,それなりに教育的(?)な意図があっての企みのつもりではある。

それはともかくとして,初学者が手計算で行列の演算を行う場合,各成分が整数か有理数のサイズの小さな行列の積の計算をする程度なので,そういった計算に向いたプログラミング言語はないかと web を検索してみた。その結果,今まで私がまったく触れたことのない Julia というプログラミング言語の存在を知った。

Julia で行列の基本的な演算を行う方法の日本語で書かれた解説ブログはそこそこの件数がヒットし,それらの記事を参考にやってみたところ,途中,自分の手書きメモの行列の成分を入力し間違えるミスもあったが,無事,8 つの行列をかけ終え,期待通りの結果を得ることができた。Julia の公式サイトからインストール用のファイルをダウンロードし,インストールし,計算を終えるまで,30分足らずの出来事であった。

Haskell あたりでもそのくらいのことはデフォルトでできるのではないかと勝手に思い込んでいるが,ちょっと検索した限りではそういう感じではないらしい。教育目的で,小さなサイズの有理数成分の行列の基本演算や掃き出し計算を手軽にできるソフトがあってもよさそうなものだが,今のところ私はそれを知らない。オンラインでそういった計算をさせてくれる個人的なサイトは間違いなくあると思うのだが。また,大学等の教育機関の教員がやはり個人的に開発したそういったソフトウェアを学内限定で公開しているものもあるに違いない。

あ,もちろん,Maple や Mathematica といった強力な数式処理ソフトではそんなのお茶の子さいさいかもしれないので,わざわざ自前で開発する必要がないだけかもしれない。

Excel 等の表計算ソフトでもマクロを使えばそれくらいの機能は容易く実現できるだろうが,いかんせん私にはいまだそういうツールを作るスキルが全くないもので,「無いのなら 自分で作ろう ホトトギス」というわけにはいかないのが歯がゆいところである。GAS というのをかじって Google スプレッドシートで実装するというのを夢見て今宵は眠りにつくとしよう。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

指数関数の定義と基本性質を考えていたら・・・。

2020-06-07 20:11:48 | mathematics
指数関数 ax のきちんとした定義の流れを詰めるのは,大学初年級で習う微分積分の知識を総動員することになるので,これをそういった講義の目標にしてもよいくらいだ,といった意見を述べた文章をだいぶ前に目にしたことがある。ソースの本のあたりはついているのだが,それが今ちょっと見当たらないので,その本を探すことと,見つけたらここに追記することのどちらも忘れてなければそうしようと思う。

かれこれ十数年,学部1年生向けの微分積分の講義を担当させていただいているが,そんなに長いことやっているにも関わらず,授業の進め方が全く洗練されないまま現在に至る。
久々に数列の極限の話から真面目に知識を整理していくか,と取り組んだのが大失敗だった。ε-N 論法でバリバリ定理を証明していく,という昔懐かしの超硬派なスタイルではもちろんないが,かといって ε-N 論法から目を背けるわけでもなく,それほど難しくなさそうなところは ε-N 論法的な極限の捉え方に沿った解説を試みる,という,識者ならば容易に結末が想像できてしまうかもしれないような,あっぶな~い橋を構築しながら進んでいるところである。

このスタイルの何が問題かというと,1/n が n→∞ のときに 0 に収束するということすら証明していくという,扱うべき題材の膨大さに尽きる。関数の極限や微分法,積分法のあれやこれやを取り上げなくちゃならないのに,1/n が 0 に行くことの説明なんかしているヒマは無いねん・・・。実際に講義でどれくらいそのあたりの話題を説明するかはおいといて,せめてきちんと説明を述べた資料を学生に提供したい,そんな風にいうと教育熱心な感じが漂うが,内実は大いなる自己満足でしかないような自己の欲求を抑えることができず,その辺の講義資料をとりあえず作ってはみた。

同じ調子で級数の基本の基(キ)を解説するには時間が残されておらず,そちらはひとまず断念することにしたが,せめて関数の極限についてはそこそこ本格的な解説を作りたい,と諦め悪くあがこうとしたが,指数関数や対数関数の定義やそれらの連続性の説明をどうしようかと暗礁に乗り上げた。

三角関数についても同様の問題は存在するが,そちらは高校レベルの説明でごまかすつもりでおり,端から本腰を入れてどうこう論じるつもりはなかった。

しかし,指数関数は,指数の範囲を自然数から始めて実数全体へと拡張していくという,壮大なストーリー展開が可能であり,それをそもそも私が自力でたどり切れるかという,教える以前の問題が浮上してしまったのである。それこそ十数年前に教え始めたころにこのあたりの話をじっくり考えた記憶はあるが,そういえばあのときどうやったんだっけな~という,まるで役に立たないうすぼんやりした思い出しか私の脳に残っていない。そんなわけで,改めてそのストーリーを自分ででっち上げなければならないことになってしまった。これではとても授業資料を作るどころではない。

と,長々と愚痴とも言い訳ともつかない戯言を書き連ねてきたが,指数関数の基本的な性質をどう示すかあれこれエア思考していたところ,久々に私の大好きな,2つの正の数の積に関するYoung の不等式と呼ばれるもののとある証明が思い付き,ついでに Young の不等式から相加平均と相乗平均の不等式を導く道筋を再確認するという寄り道について書こうと思ったのが本題であった。

それについてはまた稿を改めることとする。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする