Hierbei handelt es sich um meinen ersten Post in diesem Forum. Ggf. poste ich hier im falschen Thread, wobei scipy und matplotlib die bevorzugten Bibliotheken darstellen.
Ein kurzer Hintergrund: Ich schreibe zurzeit aus Spaß an einem wissenschaftlichen Artikel mit und bin eher zufällig in letzter Zeit mehr mit Python in Berührung gekommen.
Ich möchte gerne auf eine grundlegende Funktion von Weidlich und Haag aus den 80ern Bezug nehmen, siehe Kapitel 2 in ihrem Werk:
Der mathematische Hintergrund von Kapitel 2 bei Weidlich und Haag basiert auf der Synergetik, einer Theorie, die kollektive dynamische Prozesse in komplexen Systemen beschreibt. Das Kapitel verwendet eine Master-Gleichung, um die Wahrscheinlichkeitsverteilung von Meinungen in einer Population über die Zeit zu modellieren. Diese Gleichung beschreibt, wie sich die Verteilung durch individuelle Meinungsänderungen entwickelt. Es werden verschiedene Gleichungstypen eingeführt, darunter die Fokker-Planck-Gleichung und die Langevin-Gleichung, die jeweils verschiedene Aspekte der Meinungsbildung modellieren, wie Drift- und Diffusionsprozesse. Drift beschreibt dabei die systematische Verschiebung der Meinungen, während Diffusion zufällige Fluktuationen darstellt.
Das Kapitel untersucht, wie Phasenübergänge und Bifurkationen auftreten können, wenn Meinungen in der Gesellschaft sich drastisch ändern, etwa durch äußere Einflüsse oder kollektive Effekte. Diese Prozesse führen zu stabilen oder instabilen Zuständen in der Meinungsverteilung, die entweder zu einer Gleichverteilung oder zu einer Aufspaltung in unterschiedliche, dominante Meinungen führen können.
Ich möchte besonders Bezug auf eine Grafik bzw. ein Unterkapitel nehmen. Wir befinden uns dabei in einem initialen Zustand, der eine Gaußsche Verteilung darstellt und sich durch Parameterveränderungen allmählich entwickelt. Es ist aufgrund der mathematischen Herleitung und der Natur des Fokker-Planck-Systems anzunehmen, dass bei steigender Zeit die Verteilungsfunktion bifurkiert, d.h. zwei Peaks an den äußeren Rändern annimmt. Dies beschreiben Weidlich und Haag auch in ihrem Buch mittels einer Grafik, die die Verteilung zu verschiedenen Zeitpunkten zeigt.
Wobei die z-Achse = p(n,t) die y achse = ln(t) und die x-achse 0= N wobei N = population ln(t) = zeit und P(n,t) die Wahrscheinlichkeitsverteilung im Initialzustand = unimodalen Gaußverteilung für die Meinungsverteilung P(n;t);
hier die Eklärung des Kernmodells:
1. Diskrete Zustände:
Diskrete Zustandsvariablen: In dem Modell wird die Zustandsvariable n als diskret angenommen. Dies bedeutet, dass das System eine endliche Anzahl von möglichen Zuständen besitzt, die durch diskrete Zahlen nn beschrieben werden, von 0 bis N.
Bedeutung: Jeder Zustand repräsentiert eine Konfiguration des Systems, wie z.B. die Anzahl der Individuen mit einer bestimmten Meinung in einer Population.
Herleitung: Diskrete Zustände werden oft in stochastischen Modellen verwendet, da sie leichter berechenbar sind und gut die Art von Systemen beschreiben, bei denen Zustandsübergänge klar definiert sind, z.B. Wechsel zwischen Meinungen.
2. Initialbedingung:
Anfangszustand: Die Anfangsbedingung gibt den Zustand des Systems zum Zeitpunkt t=0 an. In diesem Fall wird angenommen, dass zu Beginn die gesamte Wahrscheinlichkeit auf einen Zustand konzentriert ist, oft der mittlere Zustand. P(N//2,t=0)=1
Herleitung: In der Soziologie oder Physik beschreibt dies einen Konsens oder eine Ausgangssituation, in der alle Individuen dieselbe Meinung haben. Das Modell untersucht dann, wie sich diese Verteilung mit der Zeit unter dem Einfluss von Meinungswechseln und stochastischen Übergängen entwickelt.
3. Übergangsraten (Transition Rates):
Übergangswahrscheinlichkeiten: Die Übergangsraten zwischen den Zuständen nn und n+1n+1 oder n−1n−1 hängen von zwei Parametern ab:
Präferenzparameter δδ: Dieser Parameter beschreibt die Vorliebe für eine Meinung. Wenn δ>0δ>0, bevorzugt das System eine Bewegung in eine Richtung (z.B. Meinung 1). Umgekehrt bei δ<0δ<0.
Anpassungsparameter κκ: Dieser Parameter beschreibt die Stärke der Anpassung des Systems an eine vorherrschende Meinung. Höhere Werte von κκ bedeuten eine stärkere Neigung zur Anpassung.
Die Übergangsraten sind gegeben durch:
Wforward(n)=ν⋅exp(δ+κ⋅nN)
Wbackward(n)=ν⋅exp(−δ−κ⋅nN)
Herleitung: Diese Raten basieren auf der Annahme, dass Meinungswechsel durch stochastische Prozesse beschrieben werden können. Die exponentielle Funktion beschreibt hier, wie stark die Präferenzen und Anpassungen das Verhalten der Individuen beeinflussen.
4. Mastergleichung:
Mastergleichung: Diese Gleichung beschreibt die zeitliche Entwicklung der Wahrscheinlichkeitsverteilung P(n;t) Sie berücksichtigt, wie die Wahrscheinlichkeit durch Übergänge zwischen den Zuständen fließt.
Gleichung:
dP(n;t)dt=Wn+1→nP(n+1;t)+Wn−1→nP(n−1;t)−[Wn→n+1+Wn→n−1]P(n;t)
Herleitung: Diese Gleichung basiert auf den Prinzipien der stochastischen Prozesse, speziell der Markow-Kette, bei der die Wahrscheinlichkeit, in einem Zustand zu sein, von den Übergangswahrscheinlichkeiten in benachbarte Zustände abhängt. Es handelt sich um eine Differenzengleichung, die für jedes n die Änderung der Wahrscheinlichkeit mit der Zeit beschreibt.
5. Randbedingungen (Boundary Conditions):
Randbedingungen: Diese bestimmen das Verhalten des Systems an den Grenzen der Zustandsräume (bei n=0n=0 und n=Nn=N).
Randbedingung bei n=0 Es gibt keine Übergänge in negative Zustände, daher ist die Rückwärtsübergangsrate am unteren Rand null.
Randbedingung bei n=N Es gibt keine Übergänge in Zustände größer als N, daher ist die Vorwärtsübergangsrate am oberen Rand null.
Herleitung: Diese Bedingungen stellen sicher, dass die Wahrscheinlichkeiten in einem geschlossenen Zustandsraum bleiben und keine unphysikalischen Zustände angenommen werden.
6. Zeitevolution (Time Evolution):
Zeitliche Entwicklung: Das System entwickelt sich über diskrete Zeitschritte. Für jeden Zeitschritt wird die Mastergleichung angewendet, um die Wahrscheinlichkeiten in jedem Zustand nn zu aktualisieren.
Herleitung: Die Zeitevolution ergibt sich durch die iterative Anwendung der Mastergleichung auf jeden Zustand und die Weiterentwicklung der Wahrscheinlichkeiten über die Zeit.
7. Parameter:
Flexibilitätsparameter ν: Dieser Parameter skaliert die Übergangsraten und beschreibt, wie schnell das System zwischen Zuständen wechseln kann.
Präferenzparameter δ: Beschreibt die Vorliebe oder Tendenz zu einer bestimmten Meinung oder einem bestimmten Zustand.
Anpassungsparameter κ: Bestimmt die Neigung des Systems, sich an die Meinungsverteilung anzupassen.
Herleitung: Diese Parameter werden oft experimentell oder theoretisch bestimmt und beeinflussen, wie schnell oder stark sich das System in Richtung eines Gleichgewichts entwickelt.
Diese Kernbedingungen und Herleitungen bilden die Grundlage des Modells und steuern, wie sich die Wahrscheinlichkeiten im Laufe der Zeit entwickeln.
Nun kann ich mich der Lösung numerisch anäheren schaffe aber nicht die grafische Darstellung in python.
2D graphik -> hier kann ich durch den parameter switch die bifurcation zeigen auch wenn es nicht ganz so ausieht wie es numerisch sollte.
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.integrate import odeint
# Parameters
N = 25
k_final = 1.5
delta_final = 0
nu = 1.0 # Flexibility parameter
t_max = 10 # Maximum time to run the system
time_steps = 100 # Number of time steps
# Initial condition
def initial_distribution(x):
mean = 0
std = 0.1
return norm.pdf(x, mean, std)
#model for time evolution
def fokker_planck(p, t, nu, delta, kappa, N):
dpdt = np.zeros_like(p)
dx = x[1] - x[0]
for i in range(1, len(p) - 1):
drift = nu * (np.sinh(delta + kappa * x[i]) - x[i] * np.cosh(delta + kappa * x[i]))
diffusion = nu * (np.cosh(delta + kappa * x[i]) - x[i] * np.sinh(delta + kappa * x[i]))
dpdt[i] = -drift * (p[i+1] - p[i-1]) / (2 * dx) + diffusion * (p[i+1] - 2 * p[i] + p[i-1]) / dx**2
return dpdt
# Define the time range and x range
t = np.linspace(0.5, t_max, time_steps)
x = np.linspace(-1, 1, 400)
# Initial condition: Gaussian distribution centered at x = 0
p0 = initial_distribution(x)
# Solve the Fokker-Planck equation over time
p_t = odeint(fokker_planck, p0, t, args=(nu, delta_final, k_final, N))
# Plot the results at different time points
time_points = [0.5, 2.0, 5.0, 10.0]
plt.figure(figsize=(12, 8))
for i, time_point in enumerate(time_points):
plt.plot(x, p_t[int(time_point * time_steps / t_max)], label=f't = {time_point}')
plt.xlabel('x')
plt.ylabel('P(n;t)')
plt.title('Evolution of the Probability Distribution Over Time')
plt.legend()
plt.grid(True)
plt.show()
# Print information about the peaks in the final distribution
from scipy.signal import find_peaks
final_distribution = p_t[-1]
peaks, _ = find_peaks(final_distribution)
peak_values = final_distribution[peaks]
peak_positions = x[peaks]
print("Final time step peaks:")
print("Positions of peaks:", peak_positions)
print("Values of peaks:", peak_values)
wobei in der 3D graphik:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import norm
from scipy.integrate import odeint
# Parameters
N = 25
k_final = 1.5
delta_final = 0
nu = 1.0 # Flexibility parameter
t_max = 10 # Maximum time to run the system
time_steps = 100 # Number of time steps
# Define the Gaussian initial condition
def initial_distribution(x):
mean = 0
std = 0.1
return norm.pdf(x, mean, std)
# Fokker-Planck equation model for time evolution
def fokker_planck(p, t, nu, delta, kappa, N):
dpdt = np.zeros_like(p)
dx = x[1] - x[0]
for i in range(1, len(p) - 1):
drift = nu * (np.sinh(delta + kappa * x[i]) - x[i] * np.cosh(delta + kappa * x[i]))
diffusion = nu * (np.cosh(delta + kappa * x[i]) - x[i] * np.sinh(delta + kappa * x[i]))
dpdt[i] = -drift * (p[i+1] - p[i-1]) / (2 * dx) + diffusion * (p[i+1] - 2 * p[i] + p[i-1]) / dx**2
return dpdt
# Define the time range and x range
t = np.linspace(0.5, t_max, time_steps)
ln_t = np.log(t)
x = np.linspace(-1, 1, 400)
# Initial condition: Gaussian distribution centered at x = 0
p0 = initial_distribution(x)
# Solve the Fokker-Planck equation over time
p_t = odeint(fokker_planck, p0, t, args=(nu, delta_final, k_final, N))
# 3D Plot setup
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
# Plot the evolution of the distribution in 3D
X, T = np.meshgrid(x, ln_t)
# Create a surface plot
ax.plot_surface(T, X, p_t, cmap='viridis')
# Labels and titles
ax.set_xlabel('ln(t)')
ax.set_ylabel('n')
ax.set_zlabel('P(n;t)')
ax.set_title('3D Evolution of Probability Distribution Over Time')
plt.show()
# Parameters
N = 25 # Total number of states
kappa = 1.5 # Adaptation parameter
delta = 0.0 # Preference parameter
nu = 1.0 # Flexibility parameter
dt = 0.01 # Time step size
timesteps = 1000 # Number of time steps
# Transition probabilities P(n -> n+1) and P(n -> n-1)
def W_forward(n, N, delta, kappa):
return nu * np.exp(delta + kappa * n / N)
def W_backward(n, N, delta, kappa):
return nu * np.exp(-delta - kappa * n / N)
# Initialize probability distribution P(n, t)
P = np.zeros((N + 1, timesteps))
P[N // 2, 0] = 1.0 # Start with everyone in the middle state
# Master equation for the entire distribution over time
for t in range(1, timesteps):
for n in range(1, N): # Exclude boundaries at n=0 and n=N
W_n_forward = W_forward(n, N, delta, kappa)
W_n_backward = W_backward(n, N, delta, kappa)
W_np1_to_n = W_backward(n + 1, N, delta, kappa) # Transition rate from n+1 to n
W_nm1_to_n = W_forward(n - 1, N, delta, kappa) # Transition rate from n-1 to n
# Apply the master equation to update P(n, t)
P[n, t] = P[n, t - 1] + dt * (
W_np1_to_n * P[n + 1, t - 1] +
W_nm1_to_n * P[n - 1, t - 1] -
(W_n_forward + W_n_backward) * P[n, t - 1]
Vielen Dank im Voraus und liebe Grüße.