HTMLもといMarkdown内で行列演算とか微分とかやって欲しいな~っと思いググったら, Javascriptに標準でMathというライブラリがあるみたい. しかし,それには微分や行列演算の機能がない. 他にいいのはないかってことで,math.jsを使ったJavascriptを埋め込むのが良さそう...ということに.
math.jsの導入
例のごとく,はてなブログの管理画面からデザイン=>ヘッダより,
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/7.0.2/math.js"></script>
を追記すれば,はてなブログでmath.jsが使えます.
また,出力する際にMathJaxというJavascriptも使用するので, www.halu7.com で書いてあるように,
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML' async></script> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [["\\(","\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ] } }); </script>
を以上と同じようにヘッダ部分に追記しておけば良いかと思います~
math.js使ってみた
微分
math.derivative()
で微分.
行列
inputタグから入力された数字は一旦Number()
でデータ型を変更してからmath.jsのfunctionに渡さないと,
動いてくれません.
使う場合は忘れずに.~
任意の零行列(2階のテンソル)の作成
単位行列を作成
identity()
ならば数値入れるだけでできますわ~
行列演算
ボタンをクリックすると,3行2列の行列と2行3列の行列がランダムに生成されて,そのアダマール積と行列積が示されます.
たまに行列の生成あたりでエラーになるかな?
生成というより表示でかも...
その際は再度ボタンをクリックしてください.
アダマール積(要素ごとの積)
dotMultiply()
では行列の要素ごとの積演算になります.
行列積
math.jsではdot
はベクトル演算のみですが,multiply()
であれば行列積も可能です.
参考
- JavaScript - jsで高度な数学を扱えるライブラリを教えてください|teratail
- mathjs - cdnjs.com - The best FOSS CDN for web related libraries to speed up your websites!
- math.js | an extensive math library for JavaScript and Node.js
Javascriptによるフォーム入力は以下サイトを参考,というよりコピペ.
- JavaScriptのテキストボックスから値を取得する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
- 数値のみ入力可能 【JavaScript 動的サンプル】
- 引数を使って関数へ値を渡す - 関数 - JavaScript入門
- HTML5/フォーム/output要素 計算結果の出力欄を作る - TAG index
- JavaScriptで配列に要素を追加する方法
- JavaScriptでfor文を使ってループ処理する方法【初心者向け】 | TechAcademyマガジン
- JavaScriptでランダムの数(乱数)を作る方法
- テンプレートリテラルが実装された - JS.next
- 型変換のいろいろ - Qiita
Javascriptのmath.jsの結果を変換して出力する方法.
- math.js | Pretty printing with mathjax
- math.js | Parse
- javascript - 数式をJavascriptから読み込んでHTML上に表示させたい(MathML+MathJax) - スタック・オーバーフロー
- Mathjaxの使い方を覚えて美しい数式表示をしてみよう! - はるなぴログ
Javascriptのコード
"F12"キーでページのソースコード見ても同じだとは思いますが,一応載せときますわ.
<form id="form0" action="#"> 微分したい数式: <input type="text" id="input_message0-0" value="x^3+3*x^2+2*x"><br> 何で微分する?: <input type="text" id="input_message0-1" value="x"><br> <div align="center"><input type="button" onclick="func0()" value="送信"></div> </form> <script language="javascript" type="text/javascript"> function func0() { var input_message = math.derivative(document.getElementById("input_message0-0").value,document.getElementById("input_message0-1").value); document.getElementById("output_message0_0").innerHTML = `そのまま:${input_message}`; document.getElementById("output_message0_1").innerHTML ='$$\\LaTeX 変換:' + math.parse(String(input_message)).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message0_1")) } </script> <div align="center"> <div id="output_message0_0"></div> <div id="output_message0_1"></div> </div> <form id="form1" action="#"> <input type="number" id="input_message1" value=""> <input type="button" onclick="func1()" value="送信"> </form> <div id="output_message1"></div> <script language="javascript" type="text/javascript"> function func1() { var input_message = Number(document.getElementById("input_message1").value); document.getElementById("output_message1").innerHTML ='$$' + math.parse(String(math.zeros(input_message,input_message))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message1")) } </script> <form id="form2_1" action="#"> <input type="number" id="input_message2_1" value=""> <input type="button" onclick="func2_1()" value="送信"> </form> <div id="output_message2_1"></div> <script language="javascript" type="text/javascript"> function func2_1() { var input_message = Number(document.getElementById("input_message2_1").value); document.getElementById("output_message2_1").innerHTML ='$$' + math.parse(String(math.diag(math.ones(input_message)))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message2_1")) } </script> <form id="form2_2" action="#"> <input type="number" id="input_message2_2" value=""> <input type="button" onclick="func2_2()" value="送信"> </form> <div id="output_message2_2"></div> <script language="javascript" type="text/javascript"> function func2_2() { var input_message = Number(document.getElementById("input_message2_2").value); document.getElementById("output_message2_2").innerHTML ='$$' + math.parse(String(math.identity(input_message))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message2_2")) } </script> <form id="form3" action="#"> <div align="center"><input type="button" onclick="func3()" value="ランダムに行列を生成"></div> </form> <script language="javascript" type="text/javascript"> function func3() { // ランダムな行列を生成 var matrix_a = []; for (let i =0; i<6; i++){ matrix_a.push(Math.floor(Math.random()*11)) } matrix_a = math.reshape(math.matrix(matrix_a),[2,3]) var matrix_b = []; for (let i =0; i<6; i++){ matrix_b.push(Math.floor(Math.random()*11)) } matrix_b = math.reshape(math.matrix(matrix_b),[3,2]) // 行列を表示 matrix_a_tex = math.parse(String(matrix_a)).toTex() document.getElementById("output_message3").innerHTML ='$$\\text{行列A}=' + matrix_a_tex + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message3")) matrix_b_tex = math.parse(String(matrix_b)).toTex() document.getElementById("output_message4").innerHTML ='$$\\text{行列B}=' + matrix_b_tex + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message4")) // アダマール積 document.getElementById("output_message5").innerHTML ='$$\\text{行列A} \\circ \\text{行列A}=' + math.parse(String( math.dotMultiply(matrix_a,matrix_a))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message5")) document.getElementById("output_message6").innerHTML ='$$\\text{行列B} \\circ \\text{行列B}=' + math.parse(String( math.dotMultiply(matrix_b,matrix_b))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message6")) // 行列積 document.getElementById("output_message7").innerHTML ='$$\\text{行列A} \\times \\text{行列B}=' +matrix_a_tex +'\\times'+matrix_b_tex+'=' + math.parse(String( math.multiply(matrix_a,matrix_b))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message7")) document.getElementById("output_message8").innerHTML ='$$\\text{行列B} \\times \\text{行列A}=' +matrix_b_tex +'\\times'+matrix_a_tex+'=' + math.parse(String( math.multiply(matrix_b,matrix_a))).toTex() + '$$'; MathJax.Hub.Typeset(document.getElementById("output_message8")) } </script> <div id="output_message3"></div> <div id="output_message4"></div> <div id="output_message5"></div> <div id="output_message6"></div> <div id="output_message7"></div> <div id="output_message8"></div>