Python中不使用NumPy的指数图

问题描述 投票:0回答:3

我是python的新手,我试图在不使用NumPy的情况下在同一轴上绘制3个指数函数(不允许)。可以使用MatPlotLib,SymPy等。

下面的问题得到了广泛的答案。

为隐私而删除的代码-无需理解以下广泛的答案,也不需要回答有关此主题的任何将来的问题

python matplotlib exponential
3个回答
0
投票

当然,我希望您能理解我的顾虑,在尝试为您提供帮助时,我宁愿尽量保留我的回答。

如果无法使用Numpy 1,则必须使用math模块和旧的好清单。

您开始从标准库导入math,并从pyplot导入Matplotlib模块:

import math
import matplotlib.pyplot as plt

您决定绘制函数的间隔以及绘制所需的点数

x_0, x_N = 0, 12
N =120

N最好是N + 1个点之间的间隔数,因此我们写为

dx = (x_N-x_0)/N

现在我们可以说x_i = x_0 + dx × i,但是我们必须存储结果,以便它们可重复使用。现在我们必须使用列表,并且有两个选项:①从一个空列表开始,然后使用append循环将所有x_i设置为for

xs = []
for i in range(N+1): xs.append(x_0+dx*i)

和②列表理解

xs = [ x_0+dx*i for i in range(N+1) ]

(结果相同)。

您现在已经解决了横坐标的问题,这是纵坐标的转折;再次,我们可以使用append或列表理解

ys = []
for i in range(N+1):
    x = xs[i]
    y = math.sin(x/3.805)
    ys.append(y)

ys = [ math.sin(xs[i]/3.805) for i in range(N+1) ]

现在您可以绘制函数

plt.plot(xs, ys, label='sin(%.3fx)'%(1/3.805))
plt.legend()
plt.grid()
plt.show()

a half sine

((1)您不能使用Numpy,但是Matplotlib将在后台使用Numpy ...您传递给plt.plot的列表将立即转换为Numpy数组!并且仅在以后由绘图模块的复杂机械处理。


0
投票

这里是使用sympy的一种方法,这是Python用于符号数学的软件包。首先将x *求解为log(delta/2)/a。然后,对于某些给定值,绘制一个图。

请注意,sympy具有非常简化的绘图功能,对图例位置等的控制有限。如果需要更多控制,则需要在数组中计算函数值。

from sympy import *
from sympy.abc import x, a, b

delta = symbols('delta', real=True)
x_star = symbols('x*', real=True)
f = exp(a*x)
g = -exp(a*x)
h = exp(a*x)*sin(b*x)
eq = Eq(delta, f.subs(x, x_star) - g.subs(x, x_star))
sol = solve(eq, x_star)  # [log(delta/2)/a]

values = {a: 0.5, b: 1.5, delta:4.0}
x_star = sol[0].subs(values)

p = plot(f.subs(values), g.subs(values), h.subs(values), (x, 0, x_star), 
         show=False, legend=True, ylabel='', ylim=(-2,3.5))
p[0].line_color = 'r'
p[1].line_color = 'g'
p[2].line_color = 'b'

p.show()

结果图:resulting plot


0
投票

这里是您的版本,做了一些小改动才能使其正常工作。请注意,matplotlib的绘图功能与sympy的绘图功能略有不同。

import matplotlib.pyplot as plt
from math import exp, sin

a = 5.0
b = 10.0
d = 0.1

x_star = 6.0
#x_star =(1/a)*float((math.log1p(d/2)))#    #x* evenually needs to be in this form*#
print('x*= ',x_star)

steps = 200; r = [i*x_star/steps for i in range(steps)]  # similar to np.linspace

f_r = []
g_r = []
h_r = []
for x in r:
    y = exp(a*x)
    f = y
    f_r.append(f)
    print('f(x)= ',f)
    g = -1*y
    g_r.append(g)
    print('g(x)= ',g)
    h = y*sin(b*x)
    h_r.append(h)
    print('h(x)= ',h)

plt.plot(r, f_r, 'b--', linewidth=1, color='r', label='f(x)=exp(a*x)')
plt.plot(r, g_r, 'b--', linewidth=2, color='g', label='g(x)=-exp(a*x)')
plt.plot(r, h_r, 'b--', linewidth=3, color='b', label='h(x)=exp(a*x)*sin(b*x)')

plt.ylabel('values')
plt.xlabel('x')
plt.legend(title='functions')
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.