バレンタインデーなので LLM にハートを描かせてみた

<!-- LLM にハート型の関数を描かせてみた -->

## はじめに
こんにちは、ひよこです。今日はバレンタインデーなので、いろいろな LLM にハート型の関数を描かせてみました。果たして、どの LLM が最も美しいハートを描けるのでしょうか？

## 使った LLM
今回試した LLM は以下の通りです
- **GPT o1-pro**
- **GPT o3-mini-high**
- **Claude 3**
- **Gemini 2 pro**
- **Deepseek**

## 試したプロンプト
各 LLM に以下のようなプロンプトを与えました

```
今日はバレンタインデーです。
そこでハート型に見える関数を作って表示する python プログラムを書いて下さい。
以下の条件を考慮すること。

- 媒介変数を用いてもよい
- 条件分岐は可能な限り使わない
- ハートの部分だけが望ましいがその他の部分があってもよい
```

## 結果と考察
結果としてすべての LLM がカージオイドの変形である、いわゆるハート曲線を使っていました。
これはまあ予想の範囲内でしょうか。

** LLM が使った数式**
```math
\begin{aligned}
x &= 16 \sin^3 t \\
y &= 13 \cos t - 5 \cos 2t - 2 \cos 3t - \cos 4t
\end{aligned}
```

以下に出力結果を示しています。どの LLM もきちんとハートを赤にしている辺りはさすがですね。

### GPT o1-pro
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/194b7531-d5aa-4606-a79c-ca73b45b8b26.png)

**LLM の応答**
<details>
<summary>🐣 GPT o1-pro による応答</summary>
以下は，よく知られたハート型の媒介変数表示を用いて描画する Python の例です。条件分岐は使用していませんので，必要に応じて調整してみてください。
</details>

<details>
<summary>🐣 GPT o1-pro によるコード</summary>

```python
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t)

plt.figure(figsize=(6, 6))
plt.plot(x, y, color='red')
plt.axis('equal')
plt.axis('off')
plt.show()
```
</details>

### GPT o3-mini-high
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/68f1100b-4680-4b01-b37f-3e572fbe6da9.png)

**LLM の応答**
<details>
<summary>🐣 GPT o3-mini-high による応答</summary>
以下に媒介変数 t を用いたハート型曲線を描画するサンプルコードを示します．
</details>

<details>
<summary>🐣 GPT o3-mini-high によるコード</summary>

```python
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t)

plt.figure(figsize=(6, 6))
plt.plot(x, y, 'r', linewidth=2)
plt.axis('equal')
plt.axis('off')
plt.show()
```
</details>

### Claude 3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/7981a837-08cf-4371-b8b2-617705eac398.png)
**LLM の応答**
<details>
<summary>🐣 Claude 3 による応答</summary>
バレンタインデーにぴったりなハート型の関数を作成いたします。数学的な美しさを保ちながら、シンプルな方程式でハートを描きましょう。  
このプログラムでは、以下の特徴を持つ数式を使用してハートを描画しています。

1. 媒介変数表示を使用し、x と y をパラメータ t の関数として表現  
2. 条件分岐を使用せず、連続的な数式のみで形状を表現  
3. サイン関数とコサイン関数の組合せで滑らかなハート形を生成  

ハートの形状は、x 座標に 3 次のサイン関数、y 座標にコサイン関数の級数を使用することで実現しています。  
この方程式は数学的に美しく、スムーズなハート形を生成します。  

プログラムを実行すると、赤い線で描かれたハート型のグラフが表示され、薄いピンク色の背景と格子線で見やすく整形されています。  

この数式を少し変更することで、ハートの形状を調整することも可能です。例えば、係数を変更することでハートの幅や高さを変えることができます。
</details>

<details>
<summary>🐣 Claude 3 によるコード</summary>

```python
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t)

plt.figure(figsize=(10, 10))
plt.plot(x, y, 'r-', linewidth=2)
plt.axis('equal')
plt.grid(True, linestyle='--', alpha=0.3)
plt.gca().set_facecolor('#fff5f5')
plt.show()
```
</details>

### Gemini 2 pro
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/29980b87-921b-4434-8451-f7071866ec30.png)

**LLM の応答**
<details>
<summary>🐣 Gemini 2 pro による応答</summary>
はい、承知いたしました。バレンタインデーにちなんで、ハート型に見える関数を Python で作成し、表示するプログラムを記述します。条件分岐を可能な限り使わないように工夫します。

解説

必要なライブラリのインポート  
numpy: 数値計算用（配列の生成、三角関数の計算など）  
matplotlib.pyplot: グラフ描画用  

heart_function(t, a=1) の定義  
この関数は、媒介変数 t を使ってハート型の x 座標と y 座標を計算します。  
カージオイド (Cardioid) の変形を利用しています。カージオイドは、円の周りを別の円が滑らずに回転するときに、円周上の点が描く軌跡です。今回は、よりハート形に近づけるためにカージオイドの式を修正しています。

x = 16 sin^3(t)  
y = 13 cos(t) − 5 cos(2t) − 2 cos(3t) − cos(4t)

媒介変数 t の範囲設定  
np.linspace(0, 2*np.pi, 500) で、0 から 2π までを 500 等分した NumPy 配列 t を作成  

ハート型関数の計算  
heart_function(t, a=0.05) を呼び出して、x 座標と y 座標を計算  

グラフの描画  
plt.plot(x, y, color='red')  
plt.axis('equal')  
plt.title(...)  
plt.show()

ポイント  
条件分岐 (if 文) を使わずに、NumPy の三角関数と媒介変数表示を使ってハート型を表現しています。  
heart_function は、滑らかな曲線を得るためにパラメータ t の値から x と y を算出します。  

このプログラムを実行すると、バレンタインデーにぴったりの綺麗なハート型のグラフが表示されます。
</details>

<details>
<summary>🐣 Gemini 2 pro によるコード</summary>

```python
import numpy as np
import matplotlib.pyplot as plt

def heart_function(t, a=1):
    """
    ハート型を媒介変数表示で定義する関数
    """
    x = a * 16 * np.sin(t)**3
    y = a * (13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t))
    return x, y

t = np.linspace(0, 2*np.pi, 500)
x, y = heart_function(t, a=0.05)

plt.figure(figsize=(6, 6))
plt.plot(x, y, color='red')
plt.axis('equal')
plt.title("Happy Valentine's Day!")
plt.show()
```
</details>

### Deepseek
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/d28f3175-1cd5-40e6-91ad-b042bf507353.png)

**LLM の応答**
<details>
<summary>🐣 Deepseek による応答</summary>
特徴  
数学的に正確なハート形状: 古典的なパラメトリック方程式を使用  

x = 16 sin³(t)  
y = 13 cos(t) - 5 cos(2t) - 2 cos(3t) - cos(4t)  

視覚的効果  
ピンク色の塗りつぶし (#FF69B4)  
濃い赤の縁取り (#8B0000)  
正方形のアスペクト比維持  

バレンタイン仕様  
タイトルを追加  
軸を非表示にして装飾  

このプログラムを実行すると、数学的に正確なハート型が美しく描画されます。媒介変数を使用しているため条件分岐が不要で、純粋な数学的計算のみで形状を表現しています。
</details>

<details>
<summary>🐣 Deepseek によるコード</summary>

```python
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

plt.figure(figsize=(8, 8))
plt.fill(x, y, color='#FF69B4')
plt.plot(x, y, color='#8B0000', linewidth=2)
plt.axis('equal')
plt.axis('off')
plt.title("Valentine's Heart", fontsize=20, color='#8B0000')
plt.show()
```
</details>

## まとめ
今回の結果では、各 LLM によって微妙な違いが見られました。特に GPT モデルは一貫して正確な出力を示しました。一方、Deepseek は視覚的な美しさを重視した出力を示しました。シンプルなハートの GPT、数学のグラフ感が残る Claude3 と Gemini、そして中まできれいに色を塗っている Deepseek と各 LLM の個性が出ていますね。個人的には桃色感満載の Deepseek のハートが気に入っています。

🐣 みなさんも LLM にバレンタインを祝ってもらってみてはいかがでしょうか？
ではまた次の記事で！