ブログトップ

電子工作やってみたよ

前回 π(パイ)円周率 を求めるのにモンテカルロ法を使って遊んでみましたが、調べる範囲が解っているのになぜ乱数使ってやるの? 
と疑問が湧いたのでモンテカルロ法をちょっと変えてやってみました。
図のNo1はモンテカルロ法で、ひとつの真四角の中に乱数でランダムに点を置いて半円(1/4円)の内側にあるかを調べて数の比率で円周率を求めます。
しかし 調べる範囲が決まっているのだから、なにも不安定な乱数でやることはないと思います。
No2は端から順番に均一に調べていく方法です。 これならばらつきもなく精度が上がるのでないかと思いやってみました。
とりあえず 演算時間もあるので真四角を立て横100等分して合計10000点で調べました。



c0335218_18194215.jpg



c0335218_10462042.jpg


全プログラムリスト 

HP32Sのプログラムです。
10000点のデータが出るまでに20分かかりました。

A01 LBL A
A02 0
A03 STO X
A04 STO Y
A05 STO T
A06 STO P

B01 LBL B
B02 RCL X

C01 LBL C
C02 XEQ H
C03 0.01
C04 STO +Y
C05 RCL Y
C06 1
C07 X>Y ?
C08 GTO C
C09 0
C10 STO Y
C11 0.01
C12 STO +X
C13 RCL X
C14 PSE
C15 1
C16 X>Y ?
C17 GTO B
C18 RCL T
C19 RCL P
C20 STOP

H01 LBL H
H02 1
H03 STO +T
H04 RCL X
H05 X^2 Xの2乗
H06 RCL Y
H07 X^2
H08 +
H09 1
H10 X<Y ?
H11 RTN
H12 1
H13 STO +P
H14 RTN


使用した変数
X
Y
P
T

結果
円の内側の点  7953
真四角の全点 10000

円周率  ( 7953 * 4 ) / 10000 = 3.1812

モンテカルロ法より悪いですね。 縦横100等分ではまだ粗いということでしょうか。
しかし HP電卓でやてみるとこれでも20分かかりました。



************************************************************************

同じ動作をするものを PC9801のN88Basicで組んでみました。(古いですね)
内部演算をバイナリでやっているため、計算の終わりに近づくと少しづつ誤差が累積してきます。
演算時間は30秒くらいでしょうか。

X=0: Y=0: T=0: P=0

WHILE X < 1
PRINT X
WHILE Y < 1
T = T + 1
L = ( X^2 + Y^2 )
IF L < 1 THEN P = P + 1
Y =Y + 0.01
WEND
Y = 0
X = X + 0.01
WEND
PRINT T
PRINT P




これで終わりです。





親戚の農家から柿を貰いました。
柿の品評会で金賞を何度もとったことがあるそうです。
この家の周りには、手入れをされた柿の木がなん十本もあります。
今は 80歳をとうに過ぎていますが、柿を作り始めた歳がなんと70歳だそうで、今の私より歳をとっていたんだ。 弟子入りして教わろうかな。
最初木になっている時は渋柿ですが、木になっている状態でビニール袋を被せ渋抜きをして甘くするそうです。
柿を切って見ると断面にはゴマというのですか黒いつぶつぶがたくさんあります。 当然種なしです。
実は固くて歯ごたえがあり、とても美味しいです。
さて 悩むのは、お返しをどうしよう、ということですね。
もう少したつとりんごがもらえる予定なのでそれ持ってお返しかねて遊びに行ってみようかな。
ついでに言ってしまうと、我が家のネギの苗もこの親戚からもらったものです。
プロというか年期が入っていて市販されている苗よりもとても元気の良いものを作ります。
写真の左下にあるのはHP29c電卓です。大きさ比較のために置きましたがじゃまでしたね。
電卓の上下の長さは13cmです。  この柿を貰う前日スーパーで一つ100円の柿買ってきて食べましたが、それよりもこの方が大きくて美味しいです。

c0335218_19432926.jpg




by telmic-gunma | 2017-11-16 11:20 | HP電卓 | Trackback | Comments(0)

プログラムコンテストとは関係ないけど、kusakaさんが送ってきたプログラムです。

以下 kusaka さんのプログラム  3時休みの10分間で作ってしまったそうです。
若いですね、うらやましいなー

***********************

1~1000までの素数を見つけて合計するっていうのはどうですか?簡単かな

三時休みでできちゃった。難しい問題ないかなー

全プログラムリスト 

number of prime = 169
sum of prime = 76128
#include <stdio.h>

void main()
{
    int i;
    int a;
    int num_ans = 0;
    int sum_ans = 0;
    int prime = 0;
    for(i = 1; i <= 1000; i++){
        prime = 1;
        for(a = 2; a < i; a++){
            if(i % a == 0)
                prime = 0;
        }
        if(prime){
            printf("%d\r\n", i);
            num_ans++;
            sum_ans += i;
        }
    }
    printf("number of prime = %d\r\n", num_ans);
    printf("sum of prime = %d\r\n", sum_ans);
}


これで終わりです。

kusakaさんのC言語 シンプルですね。


c0335218_13073923.jpg

以下わたしが HP32S で組んだものです。
私の答えは 
素数の数   168
素数の加算値 76127

kusakaさんの値より、なぜかどちらも 1つ小さいです。
演算時間は丁度30分かかりました。
えーと ソフトを作った時間は、ないしょ
フローチャートなど事前に作らないとソフトを組むことできないですね。

全プログラムリスト (HP32S を使用)

変数名
A:   調査する数      初期値1として+2づつ増やし 奇数のみ調査する。
B: 調査する数を割る数  初期値1として+2づつ増やす、奇数でのみ調査する。
C: 素数を加算した合計  最初の素数2は初期値として置いておく
D: 素数の累積の数    1を最初とする。(素数2を置いてあるから)



A01 LBL A   *******

A02 3
A03 STO A   調査する数 素数2は既知とし3から調べる
A04 STO B   調査する数を割る数
A05 2
A06 STO C   素数を加算した合計 最初の2のみ手で入れておく
A07 1
A08 STO D   素数

B01 LBL B   *******
B02 RCL A   調査する数
B03 RCL B   調査する数を割る数
B04 X=Y
B05 GTO F   値が一致していれば素数なので G へ行く

C01 LBL C   *******
C02 ÷     調査する数を順次割って割り切れるかチェックする
C03 FP   (少数以下を取り出す)
C04 X=0
C05 GTO G   少数以下ゼロ、(り切れた)なら素数ではないので次の数値を調べに行く
C06 2
C07 STO +B  割る数を2増やしてチェックし直す 
C08 GTO B

F01 LBL F   ********
F02 RCL A   素数だったので今の値を素数の積算値の足す
F03 STO +C
F04 1
F05 STO +D  素数だったのでカウンターに1を足す 

G01 LBL G   *******
G02 3
G03 STO B   割る数を出発点の3に戻す
G04 2
G05 STO +A  調べる数を2増やす。
G06 1000   上限値の1000
G07 RCL A   調べる数を読み込む
G08 X>Y    調べる数が上限値を越えたか調べる
G09 GTO H   上限値を越えたのでHへ行く
G10 GTO B   まだ上限値でないのでさらにチェックを続ける

H01 LBL H   *******
H02 RCL C   素数積算値を表示する
H03 STOP   停止して終わり

これで終わりです。



C言語だとフローチャートなどなくてもリストだけで全体の動きが見られますね。
これ 図形としてプログラムの形も表現されているからでしょうか。

HP電卓の方は、コメントがあったとしても、一つづつの動作を追っていかなければ理解が難しいですね。
ましてや コメントのないリストは知恵の輪を解くようなものですか。 
これが 結構楽しいのですけけれどね。


追記
プログラムを作っていて頭が混乱してきたのでフローチャートを作りました。
これ 最初にやるべきでしたね。

c0335218_20210497.jpg

素数かいなか調査するときの数値を追って考えました。
この絵を書いたことにより頭がスッキリしました。
やはり絵で表現すると脳が理解しやすいのでしょうか。


c0335218_20213508.jpg

上の続きです。


c0335218_20221011.jpg


by telmic-gunma | 2017-10-23 14:56 | HP電卓 | Trackback | Comments(4)

HP電卓の機種事の演算速度の比較をしてみました。
方法は下記のごく単純な同一プログラムを入れてプログラムが停止するまでの時間を測定してみました。
機種によってラベル名や変数名がアルファベットや数値なったりします。
また HP32S,HP32Sⅱ,HP4Sでは初期設定の200が1ステップで済みますが、
影響は微小なので無視します。
さすが新しいHP15C_LEは旧HP15Cに比べて150倍はすごいですね。
命令の種類によって1ステップの処理時間は当然変わってくるはずですが、
機種事の比較だけならこれでよいとおもいます。

追記 2016-11-24 HP35S、HP41CVの測定結果を載せたものをこの後のブログで出しています。

テストプログラム

LBL A
2
0
0
STO 0
LBL B
1
STO -0
RCL 0
Xキ0
GTO B
 

c0335218_05582268.jpg
















c0335218_19565409.jpg



by telmic-gunma | 2016-11-17 06:20 | HP電卓 | Trackback | Comments(4)

HP電卓の機種により消費電流が大幅に違うように感じたので比較測定をしてみました。
測定したのは、電池がLR44(アルカリボタン電池)のものだけです。
他の充電式やHP28S,HP41C,HP48Gなどは電池が大きいので消費電流が大きくても持ち時間は気にならないと思い測定してありません。
電流測定は、三和計測器のデジタルテスター PC5000を使用しました。
いつも気になっていたのは、HP42Sの電池がすぐ無くなってしまうことでした。

電源OFFの状態では、全機種とも測定限界以下なので問題ないと思います。
プログラム実行中は各機種とも電流が多いですが、通常の使い方では、キー入力待ちの状態で放置されているのが多いと思います。
やはりHP42SはHP15C(旧)に比べて10倍以上電流が多いですね。
電池の消耗を防ぐには、こまめにON-OFFを実行することでしょうか。
LR44アルカリ電池の値段をアマゾンで調べたら、今では1個10円程度で購入できるのですね。
これならまとめ買いをしておけば、さほど消耗を気にすることないのでしょうか。

追記 2016年12月2日のブログ にHP15C-LE と HP35S の消費電流のデータを追加して載せてあります。
c0335218_17304883.jpg










by telmic-gunma | 2016-11-11 17:56 | HP電卓 | Trackback | Comments(0)

サーキットビュアでやった動作のシュミレーションをHP電卓でやったら面白いだろうと思いつきやってみました。
あくまで遊び半分 ソフトの大きさや精度がどのくらいになるのかのお試しです。
電卓の機種はHP42Sとサーマルプリンターを使いました。 
HP42Sはプリンター出力が出来るのでプログラムリストや数の多いデータを出すにはとても便利です。
保証書があり購入年月日を見たら両方とも1993年8月となってました。 
22年前に一緒に買ったのですね。パソコンならば MS-DOSの時代ですか。

今回、久しぶりに(22年ぶりということ)プリンターを動かそうとしたら電池が入っており電池と端子が腐っていました。
「またやっちゃたー」ということですね。
買った時にためしで動かしてそのままだったのですね。端子はもう作り直さないとダメなので、とりあえず電池ホルダー外付けで使います。
もう一つ言うとこのHP42Sは2台目なんです。1台目はお尻のポケットに入れたまま椅子に腰掛けて80kgの体重をかけてしまい可愛そうなことになってしまいました。まだどこかにあるはずなのですが、見つかりません。

(回路図とプログラムリストは絵の上でダブルクリックすると大きくなります。)
c0335218_17185517.jpg












前回サーキットビュアでシュミレーションした時ハンチングがすこし尾を引いていましたが、PID定数をいじって見たら早く収束するようになりました。 この定数に合せてHP42Sでシュミレーションしてみます。
(一番下の水色が倒立振り子の傾き出力データです)
c0335218_16592790.png












ソフトは倒立振り子の部分とPID制御回路の部分に分けて作り各々デバッグしてから一つにまとめました。
総ステップ数は66、製作は1日かからず出来ました。 大きさ、時間とも思ったより小さかったですね。
プリンターで出したリストに手でコメント書いてます。
c0335218_16532323.jpg










これが倒立振り子の傾き出力データです。 ピークの値は-0.5V程度でサーキットビュアの出力とほぼ同じです。
時間も2秒すこし手前といったところで収束しており似たような感じです。
c0335218_20153119.png










お遊びですが、やれば出来るもんですね。
1976年 HP-97を買ったとき同じようにやった覚えがあります。
温度のフィードバック制御でした。 8bitパソコンが出てくる前ですね。
この時 必死にやっていたはずですが、結果を出すことが出来なかったです。
30年、40年たっても本質をついているHPの電卓は古い感じがしません。
これからも これでいろいろ遊んでいきたいと思います。










by telmic-gunma | 2015-07-08 23:05 | HP電卓 | Trackback | Comments(2)

HP15C月面着陸ゲーム

HP19C,29Cのアプリケーションブックに "月面着陸ゲーム" があったのでHP15Cに移植しました。
15Cと19Cの命令の違いはわずかですが、"月面着陸ゲーム"はPSE命令を多用しているので動作は、HP15Cの旧タイプでないと同じ動作をしませんでした。HP15C_LEは操作方法を変えてあります。

c0335218_19330000.jpg














下記の図はダブルクリックすると大きく表示されます。と思います?
(YHP発行のアプリケーションブックのコピーです。)
c0335218_15391963.jpg




















HP15C 旧タイプの操作方法
1、 下記プログラムを入力してください。
2、 f Aと押してゲームをスタートさせてください。 
3、速度、高度、残燃料を表示し時間を3,2,1と表示していきます。
  最後 0 と表示しているときに R/S キーを押してソフトを止め 消費燃料を入力し
  またR/Sキーを押して動作させますと、同じことを繰り返します。
  0のとき以外では正常に動作しません。

下記のリストをダブルクリックすると大きく表示されます。
HP15C 旧タイプのリスト
c0335218_20215714.jpg









HP15C_LE 新タイプの操作方法
1、 下記プログラムを入力してください。
2、 f Aと押してゲームをスタートさせてください。 
3、速度、高度、を表示します。 R/Sキーを押します。
4、残燃料が表示されます。R/Sキーを押します。
5、0が表示されます。 燃料消費量を入力して R/Sキーを押します。
6、新しい 速度と高度が表示されます。R/Sキーを押します。
7、R/Sキーを押して上記のことをくりかえします。

HP15C_LE のPSE命令は画面を表示してのウエイトをしてくれないようです。
ここでは 単に PSEを R/S命令に変えただけですが どなたか他に良い手が
ありましたら教えてください。

HP15C_LE 新タイプのリスト
c0335218_20220327.jpg










入力したソフトが正常であることを確認する方法として
毎回燃料消費を0のままとすると最後の衝突速度が-90となればソフトは間違っていません。

反省
今は、ゲーム機やパソコンの有る時代なので、 電卓ゲームの存在価値は、そのプログラムを実行させて遊ぶことより ゲームプログラムの製作、移植、改造するところに喜びや楽しみがあるのじゃないですか? まあなんでも楽しければ良いので、屁理屈なんて言う事ないですね。
今回見たアプリケーションブック製作されたのはもう30年以上昔になるのですね。インベーダーゲームの出来る前なのかな。
このときもうHP電卓は完成の域に達していたのですね。




by telmic-gunma | 2014-11-06 22:17 | HP電卓 | Trackback | Comments(6)