「微分・積分って結局、プログラムで何をすればいいの?」
——ここでつまずく人は多いです。
数式のまま計算したいのか、データから近似したいのか、機械学習みたいに“勾配”が欲しいのかで、最適解がガラッと変わります。
この記事は、あなたの目的に合うルートを選び、最短で「動くコード」に落とし込むためのガイドです。

1. まず押さえる:微分・積分をコード化する全体像
1-1 記号計算・数値計算・自動微分の違い
1-1-1 目的別「選び方」早見表
「プログラミングで微分・積分をしたい」と思った時、まず大事なのは**“何をしたいか”**です。
ここが曖昧だと、合わない道具を選んで遠回りになります。
大体次の3つに分かれます。
- A:式をそのまま計算したい(式→式)
例)sin(x)を微分してcos(x)みたいな式の答えが欲しい。
→ SymPy(式を扱う道具)が向いています。 - B:データ(数字の並び)から近い値を出したい(数字→数字)
例)温度の記録やグラフの点から、「傾き(増え方)」や「面積(合計)」を出したい。
→ NumPy / SciPyの数値計算が向いています(正確な式ではなく、近い値を作ります)。 - C:機械学習みたいに“勾配”が欲しい(計算→勾配)
例)「間違いが小さくなるように調整したい」ので、微分した値(勾配)が必要。
→ JAX / PyTorch / TensorFlowの自動微分が向いています。
迷ったら、この1問だけでOKです。
「入力は、式?それともデータ?それとも機械学習の計算?」
これが決まると、やる事が一気に見えます。
2. SymPyで“式”を微分・積分する(記号計算)
2-1 diff/integrateの基本手順
2-1-1 式→関数に落とすコツ
SymPyは、数学の「式」をPythonでそのまま使える道具です。
流れはとても単純で、次の3つだけ覚えれば始められます。
- 変数を作る(
xみたいな文字) - 式を作る(
sin(x)やx**2など) diff()で微分、integrate()で積分
例えば、こんな感じです。
import sympy as sp
x = sp.Symbol('x') # 変数xを作る
f = sp.sin(x) * sp.exp(x) # 式を作る
df = sp.diff(f, x) # 微分
F = sp.integrate(f, x) # 不定積分(+Cのやつ)
I = sp.integrate(f, (x, 0, sp.pi))# 定積分(区間を決める)
ここでよくある悩みが、「式は出来たけど、数字を入れて計算したい」です。方法は2つあります。
- ちょっと試すだけなら
subs()
「xに2を入れる」みたいに出来ます。
例)f.subs(x, 2) - 沢山計算したいなら
lambdify()
式を“普通の関数”みたいにして、NumPyで速く計算できます。グラフを描いたり、沢山のxで計算するなら便利です。
また、SymPyの強い所は確認がし易い事です。
例えば、積分した結果をもう一回微分して、元の式に戻るかを見れば、「合ってるか」をチェック出来ます。
勉強でも実務でも、この“戻るチェック”はかなり役に立ちます。
但し、どんな式でも必ず綺麗な答えが出る訳ではありません。
難しい式だと、答えが出なかったり、特別な形の式になったりします。
そういう時は、次の章の「数値で近い値を出す方法」に切り替えるのが現実的です。
3. 数値微分:差分法とnumpy.gradient
3-1 前進差分・後退差分・中心差分
3-1-1 刻み幅hと誤差のリアル
数値微分は、超ざっくり言うと 「少し動いたとき、どれ位増えた?」 を計算する方法です。
例えば、坂道を歩いて「ちょっと進んだら、どれくらい高さが変わった?」を見て、坂のきつさを考えるイメージです。
代表的な方法は3つあります。
- 前進差分:前だけを見る
- 後退差分:後ろだけを見る
- 中心差分:前と後ろを両方見る(大体精度が良くなり易い)
コードの形はこうです。
def f(x): return -x**3 + 3*x + 2
def forward(x,h): return (f(x+h)-f(x))/h
def backward(x,h): return (f(x)-f(x-h))/h
def central(x,h): return (f(x+h)-f(x-h))/(2*h)
ここで一番大事なのが h(ちょっと動かす量) です。
hを小さくすると正確になりそうですが、実は小さ過ぎると計算が不安定になります。
理由は、コンピュータの計算では「滅茶苦茶近い数字の引き算」をすると、誤差が目立ってくるからです。
逆にhが大き過ぎると、近似がざっくりになります。
つまり、数値微分は「小さければ勝ち」ではなく、丁度良いhが必要です。
データ(数字の並び)から微分したい時は、numpy.gradientが便利です。
配列を入れると、増え方(傾き)を配列で返してくれます。
import numpy as np
x = np.linspace(0, 1, 101)
y = np.sin(2*np.pi*x)
dy_dx = np.gradient(y, x) # xも渡すと間隔をまちがえにくい
注意したいのは、データにノイズ(揺れ)があると、微分でその揺れがもっと大きく見える事です。
「値がガタガタする…」となったら、データを少し滑らかにしてから微分したり、別の方法(近い線を作ってから微分)を考えると安定します。
4. 数値積分:台形則・シンプソン則・quad
4-1 離散データと関数で使い分け
4-1-1 quadで定積分を“堅く”解く
積分は、イメージで言うと 「細かく足して合計する」 事です。
グラフの下の面積を足していく感じです。
ここでも最初に決めるのは、「手元にあるのは何か」です。
- 点のデータ(xとyがたくさんある) → 台形則・シンプソン則
- 関数として計算出来る(f(x)が書ける) →
quad(SciPy)
まず、データ(点の集まり)を積分するなら、SciPyのtrapezoid(台形)やsimpson(シンプソン)が使い易いです。
from scipy.integrate import trapezoid, simpson
import numpy as np
x = np.linspace(0, 1, 101)
y = 4/(1+x**2)
area_t = trapezoid(y, x) # 台形で足す
area_s = simpson(y, x) # もっと上手に足す(ことが多い)
次に、「関数で計算出来る」ならquadが便利です。
区間も入れるだけで、定積分の値を出してくれます。
from scipy.integrate import quad
f = lambda x: 4/(1+x**2)
val, err = quad(f, 0, 1)
quadは、ただ足し算するだけでなく、「この辺が変化が大きいから細かく見よう」みたいに工夫して計算してくれます。
だから、関数があるなら強いです。
コツはシンプルで、
データなら trapezoid/simpson、関数なら quad。
最初は両方やって、値が大体同じになるか比べるのも良い練習です。
5. 自動微分:JAX/PyTorch/TensorFlowで勾配を取る
5-1 grad/autograd/GradientTape入門
5-1-1 数学の微分と何が同じで何が違う?
自動微分は、「コンピュータが計算した流れを覚えておいて、あとから微分の結果を出す」方法です。
難しそうですが、考え方はわりと単純です。
- 数値微分:少しずらして近い値を作る(hが必要)
- 記号微分:式を変形して答えの式を出す
- 自動微分:計算の手順をたどって、連続したルールで正しく出す
自動微分が良く使われるのは、機械学習の「学習」です。
学習では「間違い(損失)を小さくしたい」ので、「どっち向きに変えたらよくなる?」という情報、つまり勾配が必要になります。
JAXならgrad、PyTorchならautograd、TensorFlowならGradientTapeが代表です。
ここで気を付けたいのは、名前が似ている物でも役割が違う事です。
例えば、JAXには配列の増え方を見るjnp.gradientもありますが、これは「数値微分」の仲間です。
学習で使う“自動微分”はjax.gradの方です。
つまり、「配列から傾き」なのか、「関数の勾配」なのかで使う物が変わります。
自動微分はとても便利ですが、何でも微分出来る訳ではありません。
例えば「丸める」「順位をつける」「条件でガラッと変わる」みたいな計算だと、うまく微分出来ない事があります。
なので、最初は「滑らかな計算(連続的に変わる計算)」で試すのがお勧めです。
6. つまずきポイント:精度・発散・速度
6-1 検算とデバッグの型
6-1-1 微分と積分で相互チェックする
微分や積分は、コードが動いても「答えが正しい」とは限りません。
エラーが出ないのに、数がちょっと変…というのが一番辛い所です。
だから、最初からチェックのやり方を持っておくと安心です。
まずお勧めは、簡単な式でテストする事です。
多項式(x**2とか)なら、答えが分かり易いので練習に向いています。
次に強いのが、微分と積分を使って“戻るか”を見る方法です。
- 積分した結果を微分して、元の式に戻る?
- 微分した結果を積分して、元っぽい形に戻る?(定数のズレは起こります)
これをすると、「コードの書き方が合ってるか」をかなり見抜けます。
数値微分なら、hを変えてみるのもチェックになります。
hを少し変えただけで答えが大きく変わるなら、どこかに無理があるサインです。
数値積分なら、点を増やしてみます。
点を増やすほど値が落ち着くなら、うまくいっている可能性が高いです。
そして良くあるミスがこれです。
np.gradientで、xの間隔を入れずに計算してしまう- xの幅がバラバラなのに、同じ幅だと思って計算してしまう
- データの揺れ(ノイズ)で、微分がガタガタになる
困ったら、まずは「入力のxは正しい?間隔は正しい?」を疑うと、かなり解決します。
7. 学習ロードマップ:最短で“使える”状態へ
7-1 今日から手を動かす練習メニュー
7-1-1 30分×3回のミニ課題
微分・積分は、読んで分かった気になっても、実際に使おうとすると止まります。
だからお勧めは、短い時間で3つのルートを1周して、「出来る形」を作る事です。
【1回目:SymPyで“式”に慣れる(30分)】
x**3 + 2*xを作って、微分・積分をしてみます。
更に、積分した結果を微分して元に戻るか見ます。
ここで「式をいじる感覚」が身につきます。
【2回目:数値微分・数値積分を体で覚える(30分)】
差分法で微分して、hを0.1→0.01→0.001みたいに変えて、答えがどう変わるか見ます。
次に、点のデータを作って、trapezoidとsimpsonで積分して比べます。
ここで「近い値を出すってこういう事か」が分かります。
【3回目:自動微分で“勾配を使う”を体験(30分)】
簡単な関数(たとえば二次関数)を用意して、「一番小さくなる場所」を探します。
その時に自動微分で勾配を出して、少しずつ近づけます。
ここで、微分が“ただの勉強”じゃなく“道具”になる感覚が出ます。
この3回をやるだけで、微分・積分がかなり身近になります。
あとは、あなたの目的(データ分析・シミュレーション・機械学習)に合わせて、必要な部分だけ深掘りすればOKです。
まとめ
「プログラミングで微分・積分をしたい」と思った時に一番大事なのは、自分が何をしたいのかを先に決める事です。
実は、微分・積分のやり方は大きく3つに分かれます。
1つ目は、式をそのまま計算したいとき。
例えば「この式を微分したらどんな式になる?」みたいな場合です。
こういう時は、式を扱える道具(例:SymPy)が向いています。
2つ目は、データ(数字の並び)から近い値を出したい時。
グラフの点から「傾き」や「面積っぽい合計」を出すイメージです。
この場合は、差分(ちょっとずらして比べる)や、台形みたいに分けて足す方法を使います。
3つ目は、機械学習などで“勾配”が欲しい時。
これは「計算のしかたを覚えておいて、自動で微分してくれる」タイプの道具(自動微分)が役に立ちます。
数値で微分や積分をするときは、近い値を作る方法なので、ちょっとした設定(例えば「どれくらい細かく見るか」)で答えが変わることがあります。
だから、最初から「合ってるか確認するクセ」をつけるのが大切です。
お勧めは、簡単な式で試してみたり、積分した結果を微分して元に戻るか見たりして、チェックする事です。
結局のところ、微分・積分は「難しい数学」じゃなくて、目的に合わせて道具を選び、確かめながら使う技術です。
ここを押さえれば、ちゃんと味方になります。
コメント