様々な学問/勉強課目をシミュレーションで解説!シミュレーター/ツール/ゲームで、いろんな学問を楽しく分かりやすく解説するサイトです!思考の改善や、効率化の話題も!
⇒ 本ブログの詳細/連絡先はコチラ!
学問系TOP AI/ChatGPT 数学 物理 統計学 コンピューター 経済学 Webツール
  1. ホーム
  2. 〇学問シミュレーター/改善・効率化
  3. AI/ChatGPT
  4. ChatGPTプログラム生成実験
  5. ChatGPT 自動プログラミング実験: 「三次関数と接線グラフ」を分かりやすく描画させてみる!
■注目記事一覧

高校数学 教科書用シミュレーターの制作に携わりました!!

統計学/確率入門:偏差値とは何か?をシミュレーターを用いて詳しく解説!

余命(〇〇年後に死亡している確率)/各年齢での死亡確率 判定

なぜ賭け/投資(株式/FX)市場はほとんどの人が勝てないのか?シミュレーションで解説!

サイコロ シミュレーターで解説!当たり回数が必ず一定に収束するわけではない!

コンピューターの全理基礎:半加算器の原理をシミュレーターで理解しよう!

本サイトの「サイコロ シミュレーター」が熊本の特別教育テレビ授業で使われました!
 
全テーマ共通記事一覧

ChatGPT 自動プログラミング実験: 「三次関数と接線グラフ」を分かりやすく描画させてみる!

自分が今まで理系の学問系中心に、内容を深く理解するためのシミュレータープログラムを作成してきました。このシミュレーター、簡単なものなら結構短いプログラムで書けてしまうこともあります。

「それなら、ChatGPTに全てプログラムを書かせるのも有り?」とふと思いました。ということで、様々なブラウザで動くようなシミュレーターやゲームをChatGPTに作成させる実験をしていきたいと思っています!

ChatGPT 自動プログラミング実験: 「三次関数と接線グラフ」を分かりやすく描画させてみる!

今回のお題: 三次関数と接線を分かりやすく表示

今回のお題は過去につくった↓です。

3次関数のパラメタを入力したら、それにあわせて3次関数をグラフ表示して、接線も表示するものです。ややこしいので導関数の同時表示は今回は除きます。

ChatGPT 初回命令

ChatGPTへの命令

まずは↓の命令でプログラムを出力させてみました。

3次関数の微分を接線付きで解説するプログラムをつくって下さい。javascriptで作って、ブラウザで動く形式で出力して下さい。

コード

生成されたプログラムが↓ですね。

生成コード
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3次関数の微分と接線描画</title>
    <style>
        canvas {
            border: 1px solid black;
        }
    </style>
</head>
<body>
<h1>3次関数の微分と接線描画</h1>
<p>3次関数: y = ax^3 + bx^2 + cx + d</p>
<label for="a">a:</label>
<input type="number" id="a" value="1">
<label for="b">b:</label>
<input type="number" id="b" value="1">
<label for="c">c:</label>
<input type="number" id="c" value="1">
<label for="d">d:</label>
<input type="number" id="d" value="1">
<label for="x">x:</label>
<input type="number" id="x" value="1">
<button onclick="draw()">描画</button>
<p id="result"></p>
<canvas id="canvas" width="400" height="400"></canvas>
<script>
    function cubicFunction(a, b, c, d, x) {
        return a * x ** 3 + b * x ** 2 + c * x + d;
    }

    function cubicDerivative(a, b, c, x) {
        return 3 * a * x ** 2 + 2 * b * x + c;
    }

    function draw() {
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        const a = parseFloat(document.getElementById('a').value);
        const b = parseFloat(document.getElementById('b').value);
        const c = parseFloat(document.getElementById('c').value);
        const d = parseFloat(document.getElementById('d').value);
        const x = parseFloat(document.getElementById('x').value);

        const tangentSlope = cubicDerivative(a, b, c, x);
        const tangentYIntercept = cubicFunction(a, b, c, d, x) - tangentSlope * x;

        const tangent = (x) => tangentSlope * x + tangentYIntercept;

        ctx.beginPath();
        ctx.moveTo(0, canvas.height - cubicFunction(a, b, c, d, 0));
        for (let i = 1; i <= canvas.width; i++) {
            ctx.lineTo(i, canvas.height - cubicFunction(a, b, c, d, i));
        }
        ctx.stroke();

        ctx.beginPath();
        ctx.strokeStyle = 'red';
        ctx.moveTo(0, canvas.height - tangent(0));
        for (let i = 1; i <= canvas.width; i++) {
            ctx.lineTo(i, canvas.height - tangent(i));
        }
        ctx.stroke();

        document.getElementById('result').innerHTML = `微分係数: ${tangentSlope.toFixed(2)}`;
    }
</script>
</body></html>

生成されたシミュレーター

実際のシミュレーターがコチラです。確かに動くけど、xの範囲が0以上で死ぬほどわかりにくいです、、

改変1: xの範囲を適正化

改変命令

わかりやすくするために命令を追加しました

xの表示
範囲を-10から10の範囲にして

生成コード

変更点だけ。↓のように描画してるとこをx=-10~10の範囲に絞ってくれました。意図した通り!

改変部分コード
ctx.beginPath();
ctx.moveTo(scaleX(-10), scaleY(cubicFunction(a, b, c, d, -10)));
for (let i = -10; i <= 10; i += 0.1) {
    ctx.lineTo(scaleX(i), scaleY(cubicFunction(a, b, c, d, i)));
}
ctx.stroke();

生成されたシミュレーター

↓のとおり。これで実用できるレベルにはなりましたね。

改変2: 接点xの位置をアニメーション化

ChatGPTへの命令

わかりやすくするために命令を追加しました

接線の位置をx=-10から10までアニメーションで動かすようにしてほしい

生成コード

改変部分
    function animate(timestamp, x) {
        draw(x);

        if (x < 10) {
            x += 0.1;
            requestAnimationFrame((ts) => animate(ts, x));
        } else {
            animationRunning = false;
        }
    }

生成されたシミュレーター

これが生成されたシミュレーター。意図した通り!かなりわかりやすくなりましたー!

改変3: STOPボタンの実装

ChatGPTへの命令

これだと速すぎてわからないので、一時停止ボタンが欲しいですよね。それを命令してみました。

STOPボタンを追加して、アニメーションを一時停止にできるようにして
以下のコードでは、アニメーションを一時停止するための「STOP」ボタンが追加されています。このボタンをクリックすると、アニメーションが一時停止し、再度クリックするとアニメーションが再開されます。

生成コード

↑の説明文からすると、意図は伝わってるようにみえましたが、、、

改変部分
function animate(timestamp, x) {
    if (stopRequested) {
        stopRequested = false;
        return;
    }

    draw(x);

    if (x &lt; 10) {
        x += 0.1;
        requestAnimationFrame((ts) =&gt; animate(ts, x));
    } else {
        animationRunning = false;
    }
}

function toggleAnimation() {
    if (!animationRunning) {
        animationRunning = true;
        stopRequested = false;
        requestAnimationFrame((ts) =&gt; animate(ts, -10));
    }
}

function stopAnimation() {
    stopRequested = true;
}

生成されたシミュレーター

うーんSTOPはできるけど止まらない、、

改変4: STOPボタンの修正

なんか実装ミスだったので、何回か命令して修正してもらいました

ChatGPTへの命令

STOPボタンもう一度押しても、アニメーションが再開されません
いや、STOPボタンで停止してから、もう一回STOPボタン押したら、そこから再開されるはずなのですが。動かないです。

生成コード

↓のようにちゃんとtoggleになるようになおしてくれました。

改変部分
function toggleStop() {
    stopRequested = !stopRequested;
    if (!stopRequested) {
        animate();
    }
}

生成されたシミュレーター

なんかアニメーション開始/再開ってボタンはバグってますが、STOPボタンの一時停止/再開は正常化しました!

結論:三次関数など、典型的なプログラムなら結構いける!

今回の実験で、接線の描画のアニメーション化までできてしまったのでビックリしましたね。バグが発生してからは苦労しますが、初期プログラム生成としては十分価値があるものだと思います!


⇒「ChatGPTプログラム生成実験」カテゴリ記事一覧

その他関連カテゴリ




お気軽にコメントお願いします!

Your email address will not be published. Required fields are marked *




記事カテゴリ