自作の数値計算ライブラリを PyPI で公開する
応用プログラミング グループワーク企画 / 企画:testjikuji
1人1モジュール、最終回までに
pip install numerical-analysis-teamで誰でも使える形へ
この README は、いまは「企画の案内」と「参加の手順」です。最終発表のときに、利用者向けの説明に書き換えます。
やりたいこと
授業で習う数値計算の手法を自分の手で動くプログラムにして、だれでも pip install で使えるライブラリとして公開します。
!pip install numerical-analysis-team
from numerical_analysis_team import roots # 非線形方程式(見本・作成済み)
from numerical_analysis_team import pde # 偏微分方程式(企画者が担当)
from numerical_analysis_team import ... # ← ここにあなたのモジュールが入ります
- ライブラリは1つ、モジュールは1人1つ。
numerical-analysis-teamの中に、各自がファイルを1つ足します。 - 申請や登録はいりません。 PyPI の名前はもう取ってあります。
- テストと公開は自動です。 GitHub Actions が、Pull Request のたびにテストを実行し、リリースのときに PyPI へ公開します。
- 中身は自由で、レベルは問いません。 授業の手法を1つ、教科書どおり素直に書くだけで十分です。
ねらい:授業内容を動くソフトウェアにまとめ、他人が使える形で説明できるようになること。
テーマ例
授業の回に沿った例です。ここにないテーマでもかまいません。手法の細かい一覧は 📋 授業内容チェックリスト にあります。
| テーマ例 | モジュール名の例 | 主に使う授業回 |
|---|---|---|
| 1次元偏微分方程式ソルバー(拡散・Burgers・KdV) ← 企画者 | pde |
第2、4・5、12・13、14回 |
| 非線形方程式(二分法・Newton 法・割線法) | roots(見本あり) |
第6・7回 |
| 反復解法(Jacobi 法・Gauss–Seidel 法・SOR 法・CG 法) | linalg_iterative |
第8・9回 |
| 補間(Lagrange 補間・スプライン補間) | interpolate |
第10回 |
| 数値積分(台形則・Simpson 則・Gauss 求積) | integrate |
第11回 |
| 常微分方程式(Euler 法・Runge–Kutta 法) | ode |
第12・13回 |
| 固有値計算(べき乗法・QR 法) | eigen |
第14回 |
テーマが重なったら、Issue で相談して調整しましょう。
企画者のテーマ:1次元偏微分方程式ソルバー
拡散方程式から始めて、非線形項、分散項と1つずつ足していきます。詳しくは #1。
| 拡散方程式 | 粘性 Burgers 方程式 | KdV 方程式(発展) | |
|---|---|---|---|
| 式 | u_t = α u_xx | u_t + u u_x = ν u_xx | u_t + 6u u_x + u_xxx = 0 |
| 特徴 | 線形・放物型 | 非線形項を追加 | 拡散項を分散項に |
| 解き方 | 陽解法、Crank–Nicolson 法 | Cole–Hopf 変換で熱方程式に帰着 | ソリトン解をもつ |
| 検証 | 変数分離解 e^(−απ²t) sin(πx) | 熱方程式の解から作る厳密解 | 1-ソリトン解、保存量 |
どの方程式も厳密解と比べ、格子を細かくしたときの誤差の減り方(収束次数)が理論どおりかを CI で確かめます。
参加のしかた(ブラウザと Google Colab だけでできます)
パソコンに Python を入れる必要はありません。 GitHub の画面でファイルを書き、Google Colab で動かして確かめます。
1. GitHub のアカウントを作る
- https://github.com/signup を開く
- メールアドレス、パスワード、ユーザー名を入れて登録する
- 届いたメールのコードを入れて確認する
すでにアカウントがある人は、そのアカウントを使ってかまいません。
2. testjikuji をフォローする
- https://github.com/testjikuji を開く
- 左側の Follow ボタンを押す
企画者がフォロワーの一覧からあなたを見つけて、グループ(NumericalAnalysisClass)に招待します。招待が届いたら、フォローは外してかまいません。
3. 招待を承認する
- GitHub に登録したメールに「invited you to join the NumericalAnalysisClass organization」が届く
- メールの Join @NumericalAnalysisClass を押す
メールが見つからないときは、https://github.com/orgs/NumericalAnalysisClass/invitation を開いても承認できます。
4. 作るものを決めて、Issue を立てる
- テーマ例 と チェックリスト を見て、作りたいものを決める
- このリポジトリの上にある Issues を開き、同じテーマの Issue がないかを確かめる
- New issue を押す
- タイトルに
integrate: 台形則と Simpson 則のように「モジュール名: 作るもの」を書いて Create を押す
Issue は自分で立てます。ほかの人と同じものを作ってしまうのを防ぐためと、自分の作業の記録になるためです。以下では、例として integrate(数値積分)を作る流れを説明します。
5. GitHub の画面でモジュールのファイルを作る
-
このリポジトリのトップページで Add file → Create new file を押す
-
ファイル名の欄に
src/numerical_analysis_team/integrate.pyと入れる(/を打つとフォルダに区切られます) -
本文にコードを書く。たとえば次のようにします。
"""数値積分(第11回)。""" from typing import Callable def trapezoid(f: Callable[[float], float], a: float, b: float, n: int = 100) -> float: """複合台形則。区間 [a, b] を n 等分し、各小区間を台形で近似して足す。 誤差は刻み h = (b - a) / n の2乗に比例する(2次精度)。 """ h = (b - a) / n s = (f(a) + f(b)) / 2 for i in range(1, n): s += f(a + i * h) return s * h
-
右上の Commit changes... を押す
-
出てきた画面で Create a new branch for this commit and start a pull request を選び、ブランチ名を
feat/integrateにして Propose changes を押す -
次の画面で Create pull request を押す(まだ途中でかまいません。Pull Request は後から何度でも書き足せます)
ブランチは「自分専用の作業場所」です。
main(みんなが使う本体)を壊さずに作業でき、できあがったら Pull Request でmainに入れてもらいます。
6. テストを書く
テストは「答えが分かっている問題を解かせて、合っているかを確かめるプログラム」です。
-
ページ左上のブランチ切り替えボタン(
mainと書かれたところ)を押し、feat/integrateを選ぶ -
Add file → Create new file で、
tests/test_integrate.pyを作るimport math import pytest from numerical_analysis_team import integrate def test_trapezoid_sin(): # ∫_0^π sin x dx = 2 assert integrate.trapezoid(math.sin, 0, math.pi, n=100) == pytest.approx(2, abs=1e-3) def test_trapezoid_second_order(): # n を2倍にすると、誤差はおよそ 1/4 になる(2次精度) e1 = abs(integrate.trapezoid(math.sin, 0, math.pi, n=50) - 2) e2 = abs(integrate.trapezoid(math.sin, 0, math.pi, n=100) - 2) assert e1 / e2 == pytest.approx(4, rel=0.01)
-
Commit changes... で、今度は Commit directly to the
feat/integratebranch を選んでコミットする
7. Google Colab で動かして確かめる
https://colab.research.google.com/ で新しいノートブックを作り、セルに次を書いて実行します。
自分のブランチを入れて使ってみる
!pip install -q git+https://github.com/NumericalAnalysisClass/numerical-analysis-team@feat/integrate
import math
from numerical_analysis_team import integrate
integrate.trapezoid(math.sin, 0, math.pi) # 2 に近い値が出れば OK
テストを実行する
!git clone -q -b feat/integrate https://github.com/NumericalAnalysisClass/numerical-analysis-team.git
%cd numerical-analysis-team
!pip install -q -e ".[dev]"
!pytest -v
すべて PASSED になれば成功です。
GitHub でコードを直したあとは、メニューの ランタイム → セッションを再起動 をしてから、上のセルをもう一度実行してください。再起動しないと、古いコードが使われたままになります。
8. Pull Request をレビューしてもらう
- リポジトリの Pull requests から、自分の Pull Request を開く
- 説明欄のチェック項目を埋める
- 下のほうに自動テストの結果が出る。緑の ✓ ならテストが通っています(赤の × のときは Details を押すとエラーの内容が見られます)
- 右側の Reviewers でグループのだれか1人を選ぶ
- レビューで「ここを直して」とコメントが付いたら、同じブランチでファイルを直す(直すと Pull Request にも自動で反映されます)
- Approve(承認)がもらえたら Merge pull request を押す
ほかの人の Pull Request のレビューも、ぜひやってみてください。Files changed タブでコードを読み、行の横の + を押すとコメントを付けられます。
9. 公開されたら pip install で確かめる
企画者がリリース(バージョン番号のタグ付け)をすると、GitHub Actions が自動で PyPI に公開します。公開されたら、Colab で確かめましょう。
!pip install -U numerical-analysis-team
from numerical_analysis_team import integrate
これで、世界中のだれでもあなたのモジュールを使えるようになります。
困ったとき
| こんなとき | 原因と対処 |
|---|---|
| ファイルを作ろうとすると「Fork this repository」と出る | まだ招待を承認していません。手順 3 をやってください |
| 自動テストが赤い × になる | Details を押してエラーを読みます。分からなければ、そのまま Pull Request にコメントで質問してください |
| Colab で直したはずのコードが反映されない | ランタイム → セッションを再起動 をしてから、もう一度実行します |
ModuleNotFoundError が出る |
ファイルの場所が src/numerical_analysis_team/ の中になっているかを確かめます |
| 何をすればいいか分からない | Issues → New issue で気軽に質問してください |
書き方の約束(ファイルの分け方、テストの書き方など)は CONTRIBUTING.md にまとめています。
今使えるもの
| モジュール | 内容 |
|---|---|
roots |
二分法・Newton 法(反復の履歴つき) |
from numerical_analysis_team import roots
r = roots.newton(lambda x: x**2 - 2, lambda x: 2*x, x0=1.0)
r.root # 1.414213562373095
r.iterations # 反復回数
r.history # 各反復の近似値
Metadata
Release files for numerical-analysis-team 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| numerical_analysis_team-0.0.2.tar.gz | 7.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| numerical_analysis_team-0.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 16.3 kB
Release files / numerical_analysis_team-0.0.2.tar.gz
| Download URL | numerical_analysis_team-0.0.2.tar.gz |
|---|---|
| Size | 7.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5f71cdac9f44f3f4f212939b844978c4ac3c73cefec0a2bcd3643968d80b73bd
|
|
BLAKE2b-256 checksum How to use checksums |
88e793805cfa8602198fafbe7a4dd272b6cea7c527244bbbf4c6a959e8e7fd4e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.8
|
Release files / numerical_analysis_team-0.0.2-py3-none-any.whl
| Download URL | numerical_analysis_team-0.0.2-py3-none-any.whl |
|---|---|
| Size | 8.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
829c776bc9da3e3a3e55e17761cfd8b6c4b964a16edace3865f2a7da7b3a8d90
|
|
BLAKE2b-256 checksum How to use checksums |
a891310afc860c617037b74dd8e67b2c98c8e31758ad585d2c63ea5dc97131a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.8
|
Security for numerical-analysis-team 0.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.