User:Sintel/Zeta plot python

Code for plotting some zetas


import math
import numpy as np
import matplotlib.pyplot as plt
from mpmath import zeta, mp
from scipy.signal import find_peaks

# Set precision for mpmath
mp.dps = 15

# Define the range for t
t_min, t_max = 4.8, 42

# Real part of the variable
# Use 0.5 for critical line
sigma = 0.5

# Create array of t values
num_points = 2000
t_values = np.linspace(t_min, t_max, num_points)

# Calculate zeta function magnitude using s = sigma + 2πit/ln(2)
zeta_magnitudes = np.zeros(num_points)
for i, t in enumerate(t_values):
    s = complex(sigma, 2 * math.pi * t / math.log(2))
    zeta_magnitudes[i] = float(abs(zeta(s)))

# Create the plot
plt.figure(figsize=(24, 7))
plt.plot(t_values, zeta_magnitudes, color="black")

# Add title and labels
plt.title(f"Magnitude of Riemann Zeta Function for s = {sigma:.2f} + 2πit/ln(2)", fontsize=14)
plt.xlabel("t", fontsize=12)
plt.ylabel("|ζ(s)|", fontsize=12)

# Add grid lines
# plt.grid(alpha=0.3)

# Find local maxima
peaks, _ = find_peaks(zeta_magnitudes, height=0.5, distance=10)
peak_t_values = t_values[peaks]
peak_magnitudes = zeta_magnitudes[peaks]

# Find record maxima (peaks that are higher than any previous peak)
record_peaks = []
record_t_values = []
record_magnitudes = []
max_magnitude_so_far = 0

for i, (t, mag) in enumerate(zip(peak_t_values, peak_magnitudes)):
    if mag > max_magnitude_so_far:
        max_magnitude_so_far = mag
        record_peaks.append(i)
        record_t_values.append(t)
        record_magnitudes.append(mag)

# Mark all record peaks
plt.plot(record_t_values, record_magnitudes, "ro", markersize=4)

for t, mag in zip(record_t_values, record_magnitudes):
    # Add text label above
    name = f"{round(t)}edo"
    plt.text(
        t,
        mag + 0.25,
        name,
        ha="center",
        fontsize=10,
    )

plt.axhline(y=0, color="black", alpha=0.2)

plt.tight_layout()

ax = plt.gca()
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

plt.show()