ChatGPTに方程式を解かせてみよう

 世間をChatGPT(生成AI)なる技術が盛んに賑わせている。このワードをメディアで聞かない日は無いくらいだ。本ブログでもこのChatGPTを理系ツールの一つと考えて、少し触ってみよう。インストール方法は巷に溢れている様だから、そちらを参考にしてね。

ChatGPTの画面が開いたら、一番下の欄(Send a message)に以下のような文(青色)を入力する。

次のような方程式を解いて下さい。未知数はxです。

x^2-4*x+3=0

矢印ボタンを押してsendすると、以下の様な回答(赤色)が返ってきた(PCの環境によっては少し異なる所もあるかも)。

-----------------------------------------------------------------------------------

提供された方程式は2次方程式であり、次のように表されます:

x^2 - 4x + 3 = 0

この方程式を解くために、2次方程式の解の公式である「二次方程式の解の公式(クアドラティックフォーミュラ)」を使用します。公式は以下の通りです:

x = (-b ± √(b^2 - 4ac)) / (2a)

この公式において、方程式ax^2 + bx + c = 0の係数a、b、cを以下のように代入します:

a = 1

b = -4

c = 3

したがって、方程式を解くための公式は次のようになります:

x = (-(-4) ± √*1 / (2 * 1)

これを計算してxの値を求めます:

x = (4 ± √(16 - 12)) / 2

x = (4 ± √4) / 2

x = (4 ± 2) / 2

これを簡約化して、2つの解が得られます:

 1.    x = (4 + 2) / 2 = 6 / 2 = 3

 2.   x = (4 - 2) / 2 = 2 / 2 = 1

したがって、与えられた2次方程式の解はx = 3 と x = 1 です。

------------------------------------------------------------------------------

ここまで親切に回答してくれました。日本語が入力できるだけでなく、回答も日本語で適切にしてくれる。本当に驚きです。元々自然言語処理対応なので当然と言えば当然ですが...。

 

次はグラフも描いてくれるかなと思い、以下の文を試しに入力しました。

次の様な式をx-y平面でプロットして下さい。

y=x^2-4*x+3

矢印ボタンを押してsendすると、以下の様な回答が返ってきた。

------------------------------------------------------------------------------

指定された式をxーy平面上にプロットするために、その式のグラフを描画します。与えられた式はy=x^2-4x+3です。以下に、この式のグラフを示すPythonコードとプロットを提供します。

import numpy as np
import matplotlib.pyplot as plt

# xの範囲を設定
x = np.linspace(-1, 5, 400)

# 式を計算
y = x**2 - 4*x + 3

# グラフをプロット
plt.plot(x, y, label='y = x^2 - 4x + 3', color='blue')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graph of y = x^2 - 4x + 3')
plt.grid(True)
plt.legend()
plt.show()

このコードはNumPyとMatplotlibを使用しています。xの範囲を-1から5まで設定し、指定された式を計算してグラフにプロットしています。プロットの結果、指定した式のグラフが表示されます。

------------------------------------------------------------------------------------

いやー、すけべ心で試しただけなんだけど、Pythonコード(緑色)まで出力してきたね。ChatGPTPythonを念頭に置いていることが判るね。僕の環境ではグラフまで見れなかったので、Pythonが動くJupyter NotebookにこのPythonコードをペーストして走らせた結果が下だ。

------------------------------------------------------------------------------------

---------------------------------------------------------------------------------

Pythonの詳細が解らなくても、ここまでコードしてくれて、グラフ表示までしてくれる。なんと恵まれた環境にいることか? ChatGPTを数学・技術的方面で使用したい場合はPythonが動く環境を持つことが必要十分条件という事ですね。

ここで最も大切なのは、自分の頭を使うことの重要性を認識すること。頭を錆びらせてはいけない。効率を求める余り、PCのアウトプットに100%すがる姿勢はお勧めできない。解の信頼性を担保するために、手計算や別のツールで再確認することを忘れないようにしよう。くれぐれも頭を錆びらせないように。

*1:-4)^2 - 4 * 1 * 3

データのカーブフィット(パート3)

今回はデータのカーブフィットを実施した実例の後半を紹介する。「求められた回帰係数の桁数を減らしたい」、「計算効率を少しでも上げたい」という要求から発展したKaleidaGraphの応用編と言えよう。

------------------------------------------------------------------------------

5 回帰係数の桁落とし

 KaleidaGraphのマニュアルに記載無き内容なので、この作業は必ずしも必要ではない。興味があれば試す価値は有るだろう。KaleidaGraphのユーザーならば驚くはずだ。

KaleidaGraphの計算結果は有効桁5桁である。今ケースは電卓で計算するのに、面倒というほどの式ではないが、これ以上に式が複雑になったり、反復計算を行いたい場合は、出来るだけ回帰係数の桁は少ない事に超した事は無い。そこでKaleida Graphの回帰式ユーザー指定の機能を活用して、精度を保ったまま回帰係数の桁を少なくするテクニックを紹介する。

回帰係数を一個づつ定数に置き換えて、相関係数Rが低下しないように置き換える定数の桁を削っていく。これを全ての回帰係数で作業を行うのだ。

まずは最もErrorの小さいものからスタート。m2に直接0.861を指定する(∵図6の計算結果0.8608を桁落とし)。回帰式入力領域を以下のように変える。

 m1 * M0^ 0.861+m3; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図7の通り、相関係数に影響を及ぼしていない。

図7

 

次は0.861を0.86に指定する。回帰式入力領域を以下の通り。

 m1 * M0^ 0.86+m3; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図8の通り、まだ相関係数に影響は無い(プロットに大きな変化はないので、しばらく計算結果のみを表示する)。

図8

 

次は0.86を0.9に指定する。回帰式入力領域を以下の通り。

 m1 * M0^ 0.9+m3; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図9の通り、相関係数が僅かだが低下したので、m2は0.86に戻そう。                                               

図9

 

次にErrorの小さいものはm1だ。m1に3.796を指定する。回帰式入力領域を以下のように変える。

 3.796 * M0^ 0.86+m3; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押す、結果は図10の通り、相関係数に影響を及ぼしていない。

図10

 

次は3.796を3.79に指定する。回帰式入力領域を以下のように変える。

 3.79 * M0^ 0.86+m3; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図11の通り、まだ相関係数に影響は無い。

図11

 

次は3.79を3.8に指定する。回帰式入力領域を以下のように変える。

 3.8 * M0^ 0.86+m3; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図12の通り、まだ相関係数に影響は無い。

図12

 

最後はm3を桁落とししていくが、図10~図12のm1の変化(3.796、3.79、3.8)に対して、m3の変化(5.835、5.9009、5.7911)を見てみると、予想は付けられる。

m3を5.8586に指定して、m1を求める。回帰式入力領域を以下のように変える。

 m1 * M0^ 0.86+5.8586; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図13の通り、相関係数に影響を及ぼしていない。

図13

 

次にm3を5.859に指定して、m1を求める。回帰式入力領域は以下のようになる。

 m1 * M0^ 0.86+5.859; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図14の通り、まだ相関係数に影響は無い。

図14

 

次にm3を5.86に指定して、m1を求める。回帰式入力領域は以下のようになる。

 m1 * M0^ 0.86+5.86; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図15の通り、まだ相関係数に影響は無い。

図15

 

次にm3を5.9に指定して、m1を求める。回帰式入力領域は以下のようになる。

 m1 * M0^ 0.86+5.9; m1 = 1.1; m2 = 1.2; m3=1.3

OKボタンを押すと、結果は図16の通り、まだ相関係数に影響は無い。

図16

 

最終的な値を入力して精度が変わらないことを確認する。回帰式入力領域は以下のようになる。

 3.8 * M0^ 0.86+5.86; m1 = 1.1; m2 = 1.2; m3=1.3

(m3を5.9から5.86に戻しているのは、相関係数が僅かに下がったからで、三つの回帰係数を全て有効桁2桁には落とせなかった。)

OKボタンを押すと、結果は図17の通り。

図17

結構地味な作業だが、数式が得られれば、他の理系ツールでも利用可能となる。目出たし。

-----------------------------------------------------------------------------------

以下のURLも参考になる。

PR

www2.usaco.co.jp

データのカーブフィット(パート2)

 パート2ということで、今回はデータのカーブフィットを実施した例を紹介する。量が多いので2回に分ける。本来なら、内蔵されている線形多項式や対数関数を回帰式に採用した例を先に紹介すべきだが、それはツールのサイトを見て貰えば理解できるであろう。そこで一足飛びに「回帰式をユーザー指定するオプション」の使い方を掲載する。

データ解析ツールは複数触ってきたが、使い勝手が良く、長く付き合っているのはKaleidaGraphだ。DeltaGraphProも素晴らしい。グラフ完成度は両ツールとも科学技術論文掲載レベルなので言うことは無い。

以下にKaleidaGraphによる非線形最小二乗法によるカーブフィットの例を記載する。

-----------------------------------------------------------------------------------

非線形最小二乗法によるカーブフィットの例(KaleidaGraph)

1 計測データの用意

 通常は表計算ソフトなどのデータでよい。チャート紙のデータは適当なデジタイザーを用いるか、または手入力でデジタル化しておく。

図1はKaleidaGraphに直接入力した画面である。表計算ソフト風のデータシートに出来上がる。表計算ソフトやグラフ作成ソフトのデータであれば、大概はKaleidaGraphに読み込むことが出来る。

図1

2 実測データのグラフ化

 最上段にあるギャラリーメニューから散布図を選択する、プロットしたいデータをよく見てxとyの先頭にチェックを入れる。図2のようにグラフ化される。線の種類や太さ、凡例のシンボル形、軸、ラベル、フォント等は後から自由に変えられる。

図2

3 回帰式の見積り

 KaleidaGraphには多くの回帰曲線式が用意されている。Curve fitメニューには、以下の2つのサブメニューがある。

・General(指数関数的減衰カーブ、指数関数的成長カーブ、指数関数的増加カーブ、ガウス分布

 ミカエリス・メンテン式、べき乗フィット、S字型曲線)

・線形一次式、線形多項式、対数関数、指数関数、べき乗関数

片っ端から試して行くと、今回のデータにはべき乗関数が相応しい事がわかった。

図3は実行結果で、回帰式と相関係数Rが表示されている事が判る。見やすくするためプロットには若干の変更を加えている。

図3

4 ユーザー指定の回帰式

 単純なべき乗関数では回帰係数が2個である。さらに回帰係数を増やせば他の点も通過して、カーブフィット精度が上がるのではないだろうか?と予想できる。

ここからはCurve FitメニューのGeneralを用いて、回帰式をユーザー指定していく。Generalから図4の画面が現れる。青色で囲まれた領域にユーザー指定回帰式を入力していく。m1、m2などが回帰係数で、M0が変数xである。ユーザー指定回帰式と初期値などはセミコロンで区切る。許容誤差はデフォルトが1%である。

図4

単純なべき乗関数に回帰係数を1つ増やしたのが図5だ。初期値は安全のため、故意に1.0以外を入力してある(KaleidaGraph非線形最小二乗法にはLevenberg-Marquardtが採用されていて、この手法は初期値に敏感である事が知られている)。経験上許容誤差を1/10000としてある。もっと緩くても構わないケースがほとんどだろう。OKボタンを押すと計算が実行される。

図5

図6の結果を見ると、相当カーブフィット精度が上がっていることが判る。回帰式だけでなく、回帰係数、カイ二乗値、相関係数も出力されている。回帰式をユーザー指定すると、統計的な情報が豊富に現れる仕組みだ。

図6

このように、相関係数Rを目安に回帰式の回帰係数を増やしていくと精度がアップする。必要な精度に達したら終了である。しかし課題の初期段階ではあまり精度は考慮しなくてもよい。課題途中で精度を上げても時間のロスである。終わりが見え始めた頃にジックリ考えれば良い。

------------------------------------------------------------------------------------

 

データのカーブフィット

「手計算しにくい方程式・・・」の話から一度離れよう。

計測データから何か有用なものを得たい時、またはそのデータを二次利用したい時に、数式の形が好ましい場合がある(以下参照)。

・測定値の間に存在するであろう値を予測したい。

・理論や原理と評価したいので事前に数式化しておきたい。

・シミュレート計算するので、カーブを数式にしたい。

このような場合に活用するのが統計処理である。その中でも回帰分析という範疇に最小二乗法というカーブフィット手法がある。自然界の物理現象は直線や二次曲線で近似出来る場合は少ない。多くは対数やベキ関数の組み合わせなどの非線形になる。線形の数式であればプログラム電卓やExcelPythonなどでプログラミング容易である。しかし非線形数式へのカーブフィットプログラミングはおいそれとは行かない。プログラミングがメインワークである人は限られるのだから、出来るだけツールを見つけてそれを有効利用する方が賢い選択だ。世の中にはこの非線形最小二乗法(Levensberg-Marquardt法が有名)をやってのけるツールが複数存在する。

Excelでもカーブフィットできる」という声が聞こえてくるが、「線形なら」という条件付きと考えてよい。統計的な特殊関数まで考えたい場合は非線形最小二乗が可能なデータ解析ツールを利用したほうが絶対に楽だ。今まで遭遇したもので、推薦は以下のものだ(WinはWindows版)。

DeltaGraph Pro

KaleidaGraph

IGOR Pro

Sigmaplot (Win)

Origin Pro (Win)

TableCurve 2D (Win)

R(オープン)

SciDAVis(オープン)

 

カーブフィットに用いられる数式

個人的な知識範囲内での意見であるが、どの数式を使うか学問的に纏まられた成書は殆ど無く、ルールが確立しているとは言い難い。実験の基礎原理をよく理解して、計測データグラフと似た数式を調べて採用するしかない。そのため、上に挙げたデータ解析ツールには推奨の数式パターンが複数内蔵されていて、そこから選択できるようになっている。それを見ながらカーブフィッティングし、試行錯誤して最適と思われる数式に辿りつく。それでも内蔵の数式では、上手く測定データをカーブフィッティングできていないと思われる場合に備えて、ユーザーが数式を指定できるオプションが付属している。

 

サーフェスフィット

カーブフィットが、計測データの二次元曲線へのフィットなら、サーフェスフィットは計測データの三次元曲面へのフィッティングだ。化学プラント機器が発生する流体騒音を予測する為に一度だけ、私もTableCurve 3Dというツールを使ったことがある。「驚くべきソフトウェアだ」ということだけ言っておこう(しこしこコーディングしているのがアホらしい)。カーブフィットに飽き足らず、サーフェスフィットにもトライしたい方はデモ版をダウンロードしてみて。

TableCurve 3D(Win)

SciDAVis(オープン)

 

この分野での参考書は

手計算しにくい方程式をソフトウェアで解く(パート3)

今回の記事は7/2にアップした記事の追加と考えて欲しい。

Wolfram CloudMathematicaなどで得られた解(実数解、共役複素数解)について、時間が掛かったが突っ込んでトライしてみた。

何とかして、グラフで複素数解の存在やその値を近似したかったが、深みにハマりそうなので中止。できる所までまとめたので参考にして欲しい。残念ながらMaple文書です。

-----------------------------------------------------------------------------------

--------------------------------------------------------------------------------

まとめると、

・ツール内蔵コマンドで複素数解が得られるか確認。

・不可能ならば、数値計算プログラミングを実施。

この様にMathematicaMapleなど複数のツールで確認できれば、解の信頼性は上がるはずだ。

今回の記事では、反復計算にニュートン・ラプソン法を用いた。ツールによってはニュートン法のコマンドが用意されているものもあるだろうから、コーディングする前に調べておくと良い。

肝心なことを忘れていた、今回Mapleで用いた反復計算法(ニュートン法など)は初期値に敏感であることが分かっている。初期値に数式処理ツール(MathematicaMaple)で得た値の前後を使用した理由はここにある。

今回、ヒントをもらった本を以下に示す。

 

 

手計算しにくい方程式をソフトウェアで解く(パート2)

前回記述した、手計算しにくい方程式をソフトウェアで解く方法に、「数値計算プログラミング」を用いる、というもう一つの手段がある(そもそもコンピュータソフトウェアは、全てある言語でコーディングされているワケだけど)。

ここまでプログラミングしないで、コマンド一発で結果を出せるツールを紹介してきたのには、それなりの理由がある。産業界のエンジニアは、より高度な新製品をいち早く世に送り出す使命を担っている。出来るだけ早く計算結果が欲しいのである。あわよくば、言語でプログラミングするより、アプリケーション独自のコマンドで良いから、若干の精度は無視してでも早く結果を見れれば先に進められる。プログラミングする時間が惜しい。

これが理由である。しかしながら長い事この業界にいると、複数のアプリケーションのコマンドを使っても計算できないケースにぶち当たる。こんな時は、数学・プログラミング・数値計算などの教科書と睨めっこしながら、自前でコーディングする他ない。こんな時に味方になってくれた本を紹介する(古くて申し訳ないね)。

-------------------------------------------------------------------------------------

数値計算のために初めて購入した本である。計算例が具体的で解りやすい。

 

この本は更に深く突っ込みたい方向け。

 

熱力学の方程式の数値計算で悩んでいた時に、本屋で偶然手にした。Newton-Raphson 法を真面目に取り組む様になった記念すべき本だ。BASIC(今は見ないね)のコードも記載されていて、手元にあるTrueBASICで良く走らせていた頃が懐かしい。

 

数学全般を扱うMATLABによる科学技術計算の本。和訳本なので、若干くどい所はあるが、数値計算全般が網羅されている。MATLABコードはフリーのOctaveでも走るのかは確認していない。

---------------------------------------------------------------------------------------

学生や研究者の方でも、「今は、厳密な結果までは必要としないけど、問題のアウトラインを掴んでおきたい」なら、コマンド処理も有用な手法と考えられるのではないだろうか。

 

理系(機械・電気電子・情報)出身の転職希望者は 学歴を活かした就職先をご紹介。 この学部・学科出身者の求人を数多く取り揃えています。

 

PR

https://px.a8.net/svt/ejp?a8mat=3TDBMI+EAEJG2+33T0+TSBEB

手計算しにくい方程式をソフトウェアで解く(数値計算)

 

皆、中学または高校で、ある方程式を解くことは経験済み

これから先は、次の2のような方程式をソフトウェアで解いていく。これは数値計算の一部と考えて良い。

1 手計算で解が得られる方程式。

2 手では計算しにくいが、コンピュータソフトウェアを使うと容易に解が得られる方程式(手計算では時間がかかり過ぎる)。

3 自然界には、方程式の形は判っているのに、特定の条件で解が存在するか不明な方程式がある。

 

中学校の授業では2次方程式の解の公式を暗記させられたので、解が手計算で求められる事は分かっている。では3次方程式はどうだろうか? ご存知の人もいるだろうが、これにも解の公式がある(カルダノの公式)。4次方程式の解の公式にはカルダノの弟子フェラーリの名前が付いている。しかし5次以上の多項式方程式については、解の公式は存在しないことが19世紀に数学者らによって証明されている。でも公式が無いからと言って解が無いわけではない。コンピュータソフトウェアを用いて計算させれば、何かしらの解を得ることが可能だ。

 

例1)まず入り口として、次の様な簡単な二次方程式を考える。

式(1)の解の公式は以下の通り

具体的に簡単な数値a=2、b=1、c=-5を入れてみよう。

式(2)にこの値を代入すると、

2つの実数解が得られる事が解る。電卓を使えば近似解も得られる。今まで紹介してきたツールを使って、2次関数(y=式(1)の左辺)をプロットしておけば、y=0をその近次解が通過していることが解るはずだ。

「そんな事、解ったよ」と思った人、もう少々お付き合い願いたい。段々クールになっていくよ。

 

解の公式が無い場合

例2)上の2次方程式と同じ様な形でも、解の公式が使えない場合が容易に考えられる。以下のような方程式だ。

2乗を2.1にしただけだが、もはや解の公式は使えない。

ソフトウェアの数値計算で解を得る前に、関数(y=式(5)の左辺)をプロットして解の存在を確かめたい。そこで、xの値の範囲を予測してみる。式(4)の結果から、大体-4〜+3辺りに解はありそうかな? wxMAXIMAでプロットしたものを下に示す。wxMaximaの画面上部にあるPlotプルダウンメニューを使えば、以下の緑色の所だけの入力で済む。残りはwxMAXIMAから自動で出力されたものだ。

-------------------------------------------------------------------------------------

wxplot2d([2*x^2.1+x-5], [x,-5,3],
    
 [gnuplot_postamble, "set zeroaxis;"])$

-------------------------------------------------------------------------------------

ゼロを通過する点が解なので、x=1.4付近に解は有りそうだ。x<0の領域には実数解は無い(電卓で確認できる)。見てる領域以外に本当に実数解が無いかどうか、xの範囲を広げて確認した方が良い。また実数解が見つかったからといって、複素数解が無いとは言えない(これ以上は複素関数論の領域なので、ここでは踏み込まない)。このように関数全体を見渡しておくことをお勧めする。

wxMAXIMAには方程式の解を求めるコマンドがいくつか存在するが、今回はfind_rootを使う(このコマンドは関数ではなく方程式に変える必要がある)。

-------------------------------------------------------------------------------------

find_root(2*x^2.1+x-5=0,x,-5,3);

find_root: function has same sign at endpoints: f(-5.0)=45.85644999937932, f(3.0)=18.09021713261029
 -- an error. To debug this try: debugmode(true);

------------------------------------------------------------------------------------

エラーが出て解が求まっていない。「値の最大値と最小値で関数値の符号が同じ」であることが理由のようだ。つまり関数値ゼロの前後で、関数値を評価すれば符号が異なるので上手く行くかも。上のプロットを見ながら、x=1~2に変更し再度トライ。

-----------------------------------------------------------------------------------

find_root(2*x^2.1+x-5=0,x,1,2);

1.334417964241897

----------------------------------------------------------------------------------

今度は上手く行った。

 

例3)別のツールでも同様な結果になる事を検証しておこう。Wolfram CloudMathematicaで確認してみる。  

---------------------------------------------------------------------------------

----------------------------------------------------------------------------------

Mathematicaのプロットも同様だ。SolveとNsolveコマンドは実数値解が1個で複素数解が2個(共役複素数)存在することを示している。

このように、ツールにより計算結果の表示桁やコマンドが異なるので、是非複数のツールで結果を検証することを心掛けたい。慣れてくるとプロットせずにコマンドだけで解を求めがちになる。でも関数値をプロットして関数の全体像を把握しておくことは、視覚的にその関数の限界を知り空間認識するので、数学的なセンスが磨かれるかどうかは別にしても、個人的にはお勧めである。今なら、「推し」か。