Rustでデカルトの葉
近況
また出番が回ってきました砂子です。もう何回目の投稿になるのでしょうか?
今年は本当に暑いですね。普段エアコンは極力使わないようにしてきまたが、 さすがに暑かったのでを久しぶりに電源をいれ涼もうしました。しかし、どう も調子が悪いようなので修理を依頼しました。立ち会いの都合などで、一週間 ほど故障した状態が続いたのですがなんだか無性に暑く感じました。
新言語
さて、私はプログラマーであるわけで当然プログラム言語を記述して仕事をし ております。職務として長らく使ってきたのはC#言語となります。現職務は WEB開発のフロントエンドを担当しているのでTypeScriptをメインとしており ます。思えば、どちらもマイクロソフトに縁が深い言語ですね。
上記2つの言語を深く理解するのも大事ですが、新しいプログラミング言語を 習得し知見を広げることも大事と考え、Rustというものを学習をしてお ります。目下のところ、The Bookと呼ばれるオンラインドキュメントを 読みつつ学習しています。
公式ページにあるように速度、安全性、並行性を目的としてプログミン グ言語であるようです。最も学習を初めて間もないため3つのうち安全性に関 連した要素しか実感できておりません。此の実感した要素は安全性に関連する 「所有権」です。恐らく大半の言語では聞かない概念であると思います。
まあ、実感したというのはコードを書くうえで面倒だったということです。習得 しているプログランミング言語にもよりますが、2つ目以降の言語としてRust を学習する方々は必ずこの所有権の概念で同じことを思うでしょう。
Rustの学習がて簡単なプログラムを書いてこのブログ記事にしよと考えたち、 なにが題材としてよいか自宅にある書籍を物色しました。
デカルトの葉
いくつか書籍を眺めていたら古典的難問に学ぶ微分積分の序章にデカル トの葉が描かれてるのが目に止まりました。曲線を描くというのも難易度とし 難しくないと考えこれを題材にしようと考えました。
デカルトの葉とはWikipediaではデカルトの正葉線として説明がなされて いる代数曲線になります。大学で微積分を学んだ方なら教科書に描かれていたもの が記憶に残っているのではないでしょうか?
直行座標の方程式による定義は下記のようになります。
上記の数式はまたパラメータ表示として下記のようにも表わされます。
また、第一象限のループで囲まれる面積は下記のようになります。
そこで3つのことをRustで実現しよう。
- パラメータ表示による曲線のプロット
- 直行座標の方程式を使用した乱数による曲線のプロット
- ループで囲まれる面積の乱数を使用した近似値の計算
なお、以降ではとして計算する。
Rust 準備
Rustのインストール等の説明は公式ページを見てください。 以下ではプロジェクト作成と使用したライブラリだけを記述します。
プロジェクトを作成。引数でライブラリではなく実行可能なアプリとして設定しています。
cargo new folium_of_descartes --bin
使用する外部ライブラリを設定します。 出来上がったプロジェクトフォルダ内のCargo.tomlを下記のように編集します。
[package] name = "folium_of_descartes" version = "0.1.0" [dependencies] gnuplot = "0.0.26" rand = "0.5"
main.rsを編集後、プログラムを実行するには下記コマンド実行です。 初回はCargo.tomlで設定したライブラリのダウンロード等が行われます。 記述ミスがあった場合はこの段階でエラーなり、警告がでます。
cargo run
Rust ソースコード(main.rs)
そして、記述したコードを貼っておく。プロジェクトフォルダに出来上がったmain.rsに記述した。
extern crate gnuplot; extern crate rand; // プロット用のライブラリ use gnuplot::*; // 乱数発生用のライブラリ use rand::prelude::*; use rand::prng::XorShiftRng; //// パラメータにより曲線を描画する fn draw_curve_parameter() { // 3つの範囲で(x,y)を算出 // -100 < t < -2 let ts1 = get_parameter(-100., -2., 0.1); let xs1 = get_x_from_parameter(&ts1); let ys1 = get_y_from_parameter(&ts1); // -0.5 < t < 0.0 let ts2 = get_parameter(-0.5, 0.0, 0.05); let xs2 = get_x_from_parameter(&ts2); let ys2 = get_y_from_parameter(&ts2); // 0.0 < t < 5.0 let ts3 = get_parameter(0.0, 5.0, 0.1); let xs3 = get_x_from_parameter(&ts3); let ys3 = get_y_from_parameter(&ts3); // -5.0 < x < 5.0, -5.0 < y < 5.0 をプロット let mut fg = Figure::new(); // fg.axes2d() .set_aspect_ratio(Fix(-1.0)) .set_x_axis(true, &[]) .set_y_axis(true, &[]) .set_x_range(Fix(-5.), Fix(5.0)) .set_y_range(Fix(-5.), Fix(5.0)) .points(xs1, ys1, &[Color("green")]) .points(xs2, ys2, &[Color("blue")]) .points(xs3, ys3, &[Color("red")]); fg.show(); } /// 指定された範囲のパラメータを取得する fn get_parameter(start: f64, end: f64, step: f64) -> Vec<f64> { let mut tmp = Vec::new(); let mut x = start; while x < end { tmp.push(x); x = x + step; } tmp } /// パラメータに対応したXを取得する fn get_x_from_parameter(ts: &Vec<f64>) -> Vec<f64> { ts.into_iter().map(|t| (3.0*3.0*t)/(1.0+t.powi(3))).collect() } /// パラメータに対応したYを取得する fn get_y_from_parameter(ts: &Vec<f64>) -> Vec<f64> { ts.into_iter().map(|t| (3.0*3.0*t.powi(2))/(1.0+t.powi(3))).collect() } /// 乱数により曲線を描く fn draw_curve_random() { let seed = [0u8; 16]; let mut rng = XorShiftRng::from_seed(seed); let mut xs: Vec<f64> = Vec::new(); let mut ys: Vec<f64> = Vec::new(); let mut i = 10000000; while i != 0 { let x = rng.gen_range(-5., 5.) as f64; let y = rng.gen_range(-5., 5.) as f64; let z = x.powi(3) + y.powi(3) - 3.0 * 3.0 * x * y; if z.abs() < 0.001 { xs.push(x); ys.push(y); } i = i - 1; } let mut fg = Figure::new(); fg.axes2d() .set_aspect_ratio(Fix(-1.0)) .set_x_axis(true, &[]) .set_y_axis(true, &[]) .set_x_range(Fix(-5.), Fix(5.0)) .set_y_range(Fix(-5.), Fix(5.0)) .points(xs, ys, &[Color("blue")]); fg.show(); } /// 第一象限の面積を描く fn draw_area() { // 乱数初期化 let seed = [0u8; 16]; let mut rng = XorShiftRng::from_seed(seed); let mut xs: Vec<f64> = Vec::new(); let mut ys: Vec<f64> = Vec::new(); let size = 100000; let mut i = size; while i != 0 { let x = rng.gen_range(0., 5.) as f64; let y = rng.gen_range(0., 5.) as f64; let z = x.powi(3) + y.powi(3) - 3.0 * 3.0 * x * y; if z < 0.001 { xs.push(x); ys.push(y); } i = i - 1; } // 曲線内部と判定された割合から面積を算出する let area = 5.0 * 5.0 * xs.len() as f64 / size as f64; let mut fg = Figure::new(); fg.axes2d() .set_title(&format!("面積:{}", area), &[]) .set_aspect_ratio(Fix(-1.0)) .set_x_axis(true, &[]) .set_y_axis(true, &[]) .set_x_range(Fix(0.), Fix(5.0)) .set_y_range(Fix(0.), Fix(5.0)) .points(&xs, ys, &[Color("blue")]); fg.show(); } fn main() { draw_curve_parameter(); draw_curve_random(); draw_area(); }
結果
新言語とはいえ単純な文法だけでも曲線は十分に描け、簡単な数値実験を行な うことができた。やはりドキュメントを読むだけでは飽きが来ることや理解の 度合いが感じづらいので簡単なゴールを設定してみるとモチベーションに繋が りやすい。
パラメータ表示による曲線のプロット
パラメータによる曲線の描画は関数draw_curve_parameter()で行った。プロットは下図のようになった。 緑は で第一象限、 青はで第二象限、赤は で第4象限となります。
しかし、曲線上に均等に点が描画されると予想したがそうはならなかった。方程式の形で見ているとまるで 曲線上に点が密に分布するイメージを持つがそんなことはなかった。
直行座標の方程式を使用した乱数による曲線のプロット
関数draw_curve_with_random()で乱数で大量の座標を生成し、に適合する座標のみをプロットした。
こちらは均等に点が分布にすると考えたがならなかった。考えてみれば曲線の変化率は場所ことに違うので確かに均等に分布しないことになる。つまり、ある曲線の部分では変化率が小さいため上記の判定が真になる面積が大きいが、またある場所では変化率が大きいため上記判定で真になる面積は少ない。それが場所ごとの点の分布に現れるのではないか?
ループで囲まれる面積の乱数を使用した近似値の計算
関数draw_area_with_random()で第一象限のループ状の内部の面積を求めてみた。 上記曲線描画と同様に乱数で大量の座標を生成し、で判定された座標の個数と 生成した座標の割合を乱数生成の範囲の面積にかけて算出している。
期待値はであるので、近似値がえられている。
所感
学習中のプログラミング言語でも自分としては有益な結果がでた。学生時代にこうゆうことをやっていれば微積分にも もっと興味をもって取り組めたのではないだろうか?
Rustの習熟度は正直かなり問題ありですね。いろいろあるが早急に下記は対応したい。
- ドキュメント、コメントの書き方
- ライブラリのドキュメントの読み方
- 開発環境(Emacs)の整備
曲線の描画は興味深いテーマであったと思う。Rustの学習を進めながら曲線を調べて描画を行っていこう。 できれば学生時代の卒論であつかったMD6の実装を最終ゴールとしたい。ではこれにて。
下野花岡駅まで旅行
カノマタの番となりました
暑い日が続きますが、先週、思い切って小旅行をしました
いつも通り、「ブログどうしようかな」を鬱々とした日を送っておりました
そこで、小旅行をすることにしました
自宅から下野花岡駅まで歩き、そこから電車で宝積寺駅まで帰ってきて自宅へ帰ってくる行程です
自宅~下野花岡駅の4kmの距離、宝積寺~自宅の1kmの計5kmの小旅行です
下の地図のように歩きます
スタートの住所は、塩谷郡唯一のパチンコ店「テンダーボス」です
スタート
スタートの時間は12:00頃
気温は32℃くらいでしょうか
自宅から少々の距離のパチンコ店「テンダーボス」がスタートです
高根沢町だけでなく、塩谷郡で1店舗しかないパチンコ店です
少し東に歩くと、高根沢町に住んでいる社員の共通認識「三角のファミマ」
高根沢町のメインストリート「10号線」との交差点
向こうに見える建物はホンダの寮です
10号線沿いを歩く
10号線を北へ
まずは下り坂
草木が多い
うっそうと茂っていても、ごみは持って帰るべし
左は田んぼ
左へ曲がると、「高根沢町役場」
こんなところに中古PCショップがある
結構長らくやっている
田んぼと畑ばかりが続く
コイン精米機をよく見かけるのが、この地の特徴
カーブして東へ
10号線は大きくカーブして東へ向かいます
交通安全関所という、謎の建物
風景はあまり変化がありません
夏ですね、緑が映えます
夏でなくても緑ばかりの地ですが
結構そこかしこにある中古車販売店
ここは外国の方がやっているお店
水路に魚がたくさん泳いでる
やっと中間付近
高根沢町みんなが利用する洗車場
昼は普通の人、夜はそういったの人が利用する
自分は夜に来ることが多いです
後ろから声を掛けられました
一緒に仕事をしている人です
暑い中、10km離れた宇都宮の自宅から洗車をしに来たそうです
赤のラインのホイールは、最近買った20万円ぐらいのです
この方の車
少々休憩
再び東へ
気温もさっきより上昇しているような気がします
こんなところにもディーラーが
地元で人気のソバ屋「八溝」
行ったことはないです
高根沢町にある運動公園の入口
にある、バス停
バスにやる気が感じられない
ここへバスできたら、どうやって帰るのか?
人気のあるラーメン屋「赤大屋」
いつも結構人がいる
10号線の六角形
田んぼ、畑
温泉施設「元気あっぷ村」
一度行ったことがあるけど、結構いい施設です
「高根沢ちゃんぽん」というご当地メニューがあります
下野花岡駅周辺
青看板で左に「さくら」とあったら左へ曲がります
県道181号線との交差点です
駅前のセブンイレブンです
向こうに見える中華料理店「天昇」は定食が充実しています
ここら辺も田んぼだらけ
駅のバス停
やる気が感じられない
下野花岡駅に到着
しばらく歩くと、踏切が見えてきます
踏切の右手に見えるのが、ゴールの「下野花岡駅」です
ええ、無人駅です
だれもいません
単線です
駅構内
構内という表現が正しいのでしょうか
烏山線はワンマン列車で、カードが使えません
どのように乗り降りするのかドキドキです
宝積寺まで190円
今「13時24分」、次の電車は...と
次は「14時35分」
なんやねん!
1時間10分待って電車で帰ると自宅まで2時間弱
歩いて帰った方が早いじゃん
というわけで、35℃ぐらいのなか、歩いて帰ったとさ
何事も
計画が大事
何日も綿密に計画を立ててこそ、よい成果が出るのだと
今回の小旅行がいい例ですね
情報共有と情報伝達の重要性
EPLUの加藤です。
今回は、当社が抱えている課題について取り上げてみたいと思います。
情報共有と情報伝達の重要性
社内だけでなく社外も含めて、適切に情報を共有する、という事はビジネスを行う上で重要な活動のひとつです。
- お客様に分かりやすく情報を提供する
- お客様から必要な情報を入手する
- プロジェクトメンバーにプロジェクトの内容を説明する
情報を共有するためには、いかに正しく情報を伝達するか、が鍵になります。
続きを読むルールの重要性
はじめに
久しぶりのブログになります。Suzukiです。
今回はルールの良いところ、気を付けなければいけないところを自分の解釈で述べていきます。
ルールの設定例
モデルの実装も同様で車両モデルを例に挙げて変数のルール化をしてみます。
車両システムの一部であるシステムAは以下のような値をもつことになります。
1. CANやセンサーから出力される値(入力変数)
2. システムA内のみ使用される入力変数
3. システムAで定義された定数
4. システムA内のみで使用される出力変数
5. CAN等に出力される変数
変数をグループ分けすると
① 1, 2は入力変数
② 4, 5は出力変数
③ 3は定数
④ 1, 5は他システムとのコミュニケーションする変数
⑤ 2, 3, 4は自システムのみで活用される変数
④は先頭を大文字, ⑤は先頭を小文字にルール化します。
結果として変数は外とコミュニケーションを行うものかシステム内部のものかを判定することができます。
当たり前のようなことですが、このようなルール化はヒューマンエラーの回避、チームや他部門のコミュニケーションが円滑に進むと考えています。
どんなルールを付ければいいのか分からない時は?
そんな時には参考に先駆者の知恵を借りて対応することがベターを考えます。
例えば、モデルのお作法はJAAMBが掲げるルールを模するなど。
JAAMBHP:http://jmaab.mathworks.jp/
ルール設定で気を付けないといけないところ
ルールというものは決まり事であり、破ることは許されないのが前提です。
つまりルールを縛りすぎるということは窮屈になることであると考えています。
今まで通りの業務ができなくなり、また“無駄な”工数増加になってしまう可能性もあります。
ルールを設定はそれ相応のメリットを掲げ、設定前によく議論する必要もあると考えます。
終わりに
ルールと聞くと不自由になると思われがちですが、自由すぎることはかえって不自由になり手間がかかることもあり、必要最低限のルールは時に効率をアップさせる魔法であることを読者の方へ伝えることができたら幸いです。
自社アピール
弊社ではより一層の高い品質を提供実現の一環としてQMS取得を目指しております。
5Gのデモを見に行きました
皆さまこんにちは、Chibaです。
前回の投稿からかなり経過しました。
今現在は業務内容として、自動車のEMC解析のお手伝いをしています。
EMCとはもちろん略語で、
Electro Magnetic Conpatibility 電磁両立性 というのが正式な表現となります。
電子機器同士が、お互いの発する電磁波によって、機器の動作に影響を与えていないかを調べるお仕事、
というのがざっくりした説明となります。