если я, к примеру, буду рисовать функцию на отрезке от 0 до 1, а значения функции на этом отрезке будут огромными, то рисунок получается ужасным, в плане того, что я не знаю, как сделать так, чтобы окно рисования графика всегда было одного размера (чтобы единица измерения по оси у и по оси х не были равными)
axes.set_aspect("equal")
<- рисует масштаб один к одному
<source lang="python">
import math
import pylab
from matplotlib import mlab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path
import random
n = 5
a = 100
b = 101
dx = 0.01
k = [0] * (n+1);
t = [0] * (n+1);
def y(a):
return(math.sqrt((a-100.5)*(a-100.5) + 1)) # <- функция
c = (b - a)/(n); # <- равномерно
for j in range(0, n+1, 1):
t[j] = a + j*c
k[j] = y(t[j])
t.sort();
for i in range(n+1):
k[i] = y(t[i])
print(t[i], k[i])
def g(i, x): # start of Lagrange
l = 1;
for j in range(len(t)):
if i != j:
l = l*(x - t[j])/(t[i] - t[j])
return l
def f(x):
y = 0;
for i in range(len(t)):
y = y + k[i]*g(i,x)
return y # end of Lagrange
xlist1 = mlab.frange (t[0], t[n], dx)
xlist = mlab.frange (a , b , dx)
ylist1 = [f(x) for x in xlist]
ylist2 = [y(x) for x in xlist]
pylab.plot (xlist, ylist1)
pylab.plot (xlist, ylist2)
def drawCircles (axes):
for i in range(n+1):
circle1 = matplotlib.patches.Circle((t[i], k[i]), radius=0.01, fill=True)
axes.add_patch (circle1)
def kl(x):
y = 0
for i in range(0, n+1, 1):
if x == t[i]:
return k[i]
for i in range(0, n, 1):
if (x > t[i]) and (x < t[i+1]):
y = ((x - t[i])*(k[i+1] - k[i]))/(t[i+1]-t[i]) + k[i]
return y
ylist3 = [kl(x) for x in xlist1]
pylab.plot (xlist1, ylist3)
ymax = max(ylist3)
ymin = min(ylist3)
axes = pylab.gca()
axes.set_aspect((b-a)/(ymax-ymin))
pylab.xlim (a-(b-a)/10, b+(b-a)/10)
pylab.ylim (ymin - abs(ymin - ymax)/10, ymax + abs(ymin - ymax)/10)
drawCircles (axes)
pylab.show()
</source>
ВОПРОС ЗАКРЫТ
нужно было лишь написать вместо
axes.set_aspect((b-a)/(ymax-ymin))
axes.set_aspect(a,b,c,d), где а,b,с и d меняются от 0 до 1 и задают отпступ слева, снизу, ширину и высоту соотв.