我想以某个x值打印功能signal3的值。我的脚本很长,我尝试解释更多细节:
我有两个函数(信号(红色)和signal3(蓝色))分别由w0,f0和w0,f0,d_in更改。我想在绘图窗口中的某个x位置(其中x = d_in + 110 + 139.8)上打印signal3的当前值。这是椭圆“陷阱”开始的位置。因此,当d_in或f0或w0更改时,它应该是一个交互式值,它会更改(因为然后更改了signal3函数)。
我用for循环和if大小写尝试了一些东西,但是并没有真正解决。如果可以找到解决方案,请对我进行简单而详细的解释,因为我不太擅长python。
谢谢:)
这是我的剧本:
from __future__ import print_function
from numpy import pi, sin
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
from matplotlib.patches import Ellipse, Rectangle, Circle
from scipy.optimize import fsolve
import pylab
# Constants
w0=1.7
lamb=0.4119
f0=lamb*1.0/(299.792458)
#lamb=f0*1.0/(299.792458)
d_in=80.0
R1=46.672
R2=686.468
foc=1/((1/R1)+(1/R2))
c=299792458000.0
zR=np.pi*w0**(2)/(c/(f0*1000000000.0))
# functions
def signal(w0,f0):
return w0*np.sqrt(1.0+(x/(np.pi*w0**(2)/(c/(f0*1000000000.0))))**(2))
d_out=foc+(d_in-foc)/(((d_in)/foc-1.0)**(2)+(zR/foc)**(2))
w1=w0*np.sqrt(1.0/(((d_in)/foc-1.0)**(2)+(zR/foc)**(2)))
zR1=np.pi*w1**(2)/(c/(f0*1000000000.0))
def signal3(w0,d_in,f0):
return (w0*np.sqrt(1.0/(((d_in)/foc-1.0)**(2)+((np.pi*w0**(2)/(c/(f0*1000000000.0)))/foc)**(2))) )*np.sqrt(1.0+((x-d_in-(foc+(d_in-foc)/(((d_in)/foc-1.0)**(2)+((np.pi*w0**(2)/(c/(f0*1000000000.0)))/foc)**(2))))/(np.pi*(w0*np.sqrt(1.0/(((d_in)/foc-1.0)**(2)+((np.pi*w0**(2)/(c/(f0*1000000000.0)))/foc)**(2))) )**(2)/(c/(f0*1000000000.0))))**(2))
# Plot definitions
axis_color = 'lightgoldenrodyellow'
#axis_color = 'white'
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(111)
# X range
x_start=0.0
x_end=500.0
ax.xaxis.set_ticks(np.arange(x_start,x_end+20.0, 20.0))
# Adjust the subplots region to leave some space for the sliders and buttons
fig.subplots_adjust(left=0.25, bottom=0.35)
x = np.arange(x_start,x_end, 0.01)
# Adjust Start Values
w0_0 = 1.7
f0_0 = 727.82825
w1_0=w0*np.sqrt(1.0/(((d_in)/foc-1.0)**(2)+(zR/foc)**(2)))
d_in_0=80.0
d_out_0=foc+(d_in-foc)/(((d_in)/foc-1.0)**(2)+(zR/foc)**(2))
# Draw the initial plot
# The 'line' variable is used for modifying the line later
[line] = ax.plot(x, signal(w0_0, f0_0), linewidth=2, color='red', linestyle='--')
[line3] = ax.plot(x, signal3(w0_0, d_in_0, f0_0), linewidth=2, color='blue')
ax.set_xlim([0, 500])
ax.set_ylim([-60, 60])
# Add two sliders w_0 and d_in
# Define an axes area and draw a slider in it
w0_slider_ax = fig.add_axes([0.25, 0.2, 0.65, 0.03], axisbg=axis_color)
w0_slider = Slider(w0_slider_ax, 'output beamwaist: $\mathregular{\omega_0}$ [mm]', 0.1, 9.2, valinit=w0_0)
# Draw another slider
f0_slider_ax = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axis_color)
f0_slider = Slider(f0_slider_ax, r'center frequency:$\mathregular{\nu_0}$ [GHz]',23.0, 1100, valinit=f0_0,valfmt='%1.3f')
#Draw d_in slider
d_in_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axis_color)
d_in_slider = Slider(d_in_slider_ax, 'distance horn - mirror: d_in [mm]', 1, 150, valinit=d_in)
# Define an action for modifying the line when any slider's value changes
def sliders_on_changed(val):
line.set_ydata(signal(w0_slider.val, f0_slider.val))
line3.set_ydata(signal3(w0_slider.val,d_in_slider.val, f0_slider.val))
fig.canvas.draw_idle()
w0_slider.on_changed(sliders_on_changed)
f0_slider.on_changed(sliders_on_changed)
d_in_slider.on_changed(sliders_on_changed)
#Ellipsen etc.
#Mirror
Spiegel = Ellipse(xy=(d_in, 0), width=2, height=73.2,
edgecolor='black', fc='#808080', lw=1)
ax.add_patch(Spiegel)
#Diamond
Diamond = Ellipse(xy=(d_in+110.0, 0), width=3, height=18,
edgecolor='black', fc='#FFCC99', lw=1)
ax.add_patch(Diamond)
#Trap
Trap = Ellipse(xy=(d_in+110.0+139.8,0), width=3, height=6.6,
edgecolor='black', fc='#FFCC99', lw=1)
ax.add_patch(Trap)
#Trap1
Trap1 = Ellipse(xy=(d_in+110.0+139.8+40.0,0), width=3, height=6.6,
edgecolor='black', fc='#FFCC99', lw=1)
ax.add_patch(Trap1)
#rectangle
rect = Rectangle(xy=(d_in+110.0+139.8,-3), width=40, height=6.0,
edgecolor='none', fc='#A0A0A0', alpha=0.4,lw=1)
ax.add_patch(rect)
# Wenn d_in auch Ellipsen bewegen
def update(val):
Spiegel.center = (val,0)
d_in_slider.on_changed(update)
def update(val):
Diamond.center = (val+110,0)
d_in_slider.on_changed(update)
def update(val):
Trap.center = (val+110.0+139.8,0)
d_in_slider.on_changed(update)
def update(val):
Trap1.center = (val+110.0+139.8+40.0,0)
d_in_slider.on_changed(update)
def update(val):
rect.set_xy((val+110.0+139.8,-3))
d_in_slider.on_changed(update)
plt.show()