Найти - Пользователи
Полная версия: Данные для 3-х мерного графика
Начало » Python для новичков » Данные для 3-х мерного графика
1 2 3 4
AleksSR
Только приехал от научного руководителя. В данной задаче не имеет смысл рассматривать 100 ячеек (10 на 10), можно рассмотреть всего 10 ячеек вдоль оси х .
В исходных данных ячейка длинной 1 на 1, реальный размер ячейки 20 см, т е 0.2, поэтому исходный диапазон x и y нужно умножать на 0.2, поэтому шаг будет не 0.005, а 0.001, при этом N сохранит свои значения, т к ей важны координаты ячейки, а не реальные ее физические размеры. Ко всем исходным значениям N нужно прибавлять 0.5(это видно в моем коде).

Alex2ndr, смысл в том, что N периодические функции на ячейке, на границах каждой ячейки они должны равняться 0 (после прибавления к N 0.5). Именно поэтому порядок выглядит странным.

Размер ячейки 0.2, кол во ячеек 10 (10x1), т.е x меняется от 0 до 2 с шагом 0.001., y меняется от 0 до 0.2 с шагом 0.001.
N это 3-й столбец в исходном файле out.dat (повторюсь, к тем значениям нужно прибавить 0.5).
AleksSR
Сообразил насчет алгоритма с продлением значений N, но реализовать его пока не могу.

Нужно брать каждые 201 значения N из исходного списка и повторять их 10 (кол-во ячеек раз).
Пример упрощения. пусть ячеек 3, значений N 3. Изначально значения N(если 1 ячейка) идут в столбец:
N
1
2
1
Для 3-х ячеек столбец значений N примет вид:
1
1
1
2
2
2
1
1
1
AleksSR
data = open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r')
lines = data.readlines()
data.close()

i = 1
for count in range (1, count_l + 1):
pn = 202*(i - 1)
pk = pn + 201
for line in lines[pn:pk]:
coords = line.split()
N = float(coords[2]) + 0.5
kp = str(N) + "\n"
file3.writelines(kp)
i += 1
file3.close()
Здесь попытался реализовать алгоритм повторения значений N, из-за моего “знания” python сделанная программа не работает как надо. А именно в диапазонах вырезаемых строк индекс не меняется.
AleksSR
Проблему решил. Возникает вопрос, как с помощью Python построить 3d surface по данным из текстового файла, 3d график(вместо plot_surface используется plot) строится, а поверхность нет, как строить поверхность по данным из текстового файла? Вот конкретно проблемная часть кода:
X, Y, V0, V1, T = np.loadtxt(datafile3D, usecols=[0,1,3,4,5], unpack=True)
X_2D, V0_2D, V1_2D, T_2D = np.loadtxt(datafile2D, usecols=[0,2,3,4], unpack=True)
fig = plt.figure(1)
ax = Axes3D(fig)
ax.plot3D(X, Y, V0, label='V0')
plt.savefig('grafik\T0_3D.png', dpi=80)
Весь код на всякий случай:
#!/usr/bin/env python
# -*- coding: cp1251 -*-

import math as m
import numpy as np
from numpy import *
from scipy.special import erf
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt

math = m
materials = 2
if materials == 1:
comb = "Ti-6Al-4V SiC Al"
k1 = 1.2095
k2 = 183.8
k3 = 235
rho1 = 4429
rho2 = 3210
rho3 = 2700
c1 = 625.30
c2 = 750
c3 = 235
elif materials == 2:
comb = "SiC Ti-6Al-4V Al"
k1 = 183.8
k2 = 1.2095
k3 = 235
rho1 = 3210
rho2 = 4429
rho3 = 2700
c1 = 750
c2 = 625.30
c3 = 235

r1 = 0.3
r2 = 0.33
l = 1
s1 = pi*r1**2
s2 = pi*r2**2 - s1
s3 = l**2 - (s1 + s2)
rho_c = rho1*c1*s1/l**2 + rho2*c2*s2/l**2 + rho3*c3*s3/l**2
rho_c = float(rho_c)


l_razm = 0.2
G_razm = 2
count_l = int(G_razm/l_razm)



T0 = 300
T1 = 900
t = 1500


k_eff_chisl = 123.712
k_eff_teor = 124.023
chi = k_eff_chisl/rho_c


data_in = open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r')
lines = data_in.readlines()
data_in.close()
datafile3D = 'grafik\gr3D.txt'
data_out3D = open(datafile3D, 'a')
datafile2D = 'grafik\gr2D.txt'
data_out2D = open(datafile2D, 'a')
i = 0
for c in range(0, count_l):
for line in lines:
coords = line.split()
coordsx = float(coords[0])*l_razm + i*l_razm
coordsy = float(coords[1])*l_razm
coordsN = float(coords[2]) + 0.5
V0 = T1 - (T1 - T0)*erf(coordsx/(2*sqrt(chi*t)))
V1 = coordsN*(T0 - T1)*exp(-coordsx**2/(4*chi*t))/(sqrt(pi*chi*t))
T = float(V0 + V1*l_razm)
kp = str(coordsx) + " " + str(coordsy) + " " + str(coordsN) + " " + str(V0) + " " + str(V1) + " " + str(T) + "\n"
data_out3D.writelines(kp)
i += 1

k = 0
for c in range(0, count_l):
for line in lines[20100 : 20301]:
coords = line.split()
coordsx = float(coords[0])*l_razm + k*l_razm
coordsN = float(coords[2]) + 0.5
V0 = T1 - (T1 - T0)*erf(coordsx/(2*sqrt(chi*t)))
V1 = coordsN*(T0 - T1)*exp(-coordsx**2/(4*chi*t))/(sqrt(pi*chi*t))
T = float(V0 + V1*l_razm)
kp = str(coordsx) + " " + str(coordsN) + " " + str(V0) + " " + str(V1) + " " + str(T) + "\n"
data_out2D.writelines(kp)
k +=1


X, Y, V0, V1, T = np.loadtxt(datafile3D, usecols=[0,1,3,4,5], unpack=True)
X_2D, V0_2D, V1_2D, T_2D = np.loadtxt(datafile2D, usecols=[0,2,3,4], unpack=True)
fig = plt.figure(1)
ax = Axes3D(fig)
ax.plot3D(X, Y, V0, label='V0')
plt.savefig('grafik\T0_3D.png', dpi=80)

fig = plt.figure(2)
plt.plot(X_2D, V0_2D, label='V0')
plt.xlabel('X')
plt.ylabel('T0, K')
plt.title('Zero correction to the temperature depending on the coordinates X')
plt.xlim(0,2)
plt.ylim(300,900)
plt.grid(True)
plt.savefig('grafik\T0_2D.png', dpi=80)

fig = plt.figure(3)
plt.plot(X_2D, V1_2D, label='V1')
plt.xlabel('X')
plt.ylabel('T1, K')
plt.title('First correction to the temperature depending on the coordinates X')
plt.xlim(0,2)
plt.ylim(-300,300)
plt.grid(True)
plt.savefig('grafik\T1_2D.png', dpi=80)


fig = plt.figure(4)
ax = Axes3D(fig)
ax.plot3D(X, Y, V1, label='T1')
plt.savefig('grafik\T1_3D.png', dpi=80)
Подскажите, если не сложно.
P.S. Почему на форуме при постинге сообщений нет кнопок BB-code, каждый раз теги вручную вводить приходится.
AleksSR
Неужели никто не сталкивался с такой проблемой? Help plz народ.
asv13
import numpy as np
from pylab import *
import mpl_toolkits.mplot3d.axes3d as p3

mx = np.zeros((201, 201), float)
my = np.zeros((201, 201), float)
mz = np.zeros((201, 201), float)
for line in open('out.dat'):
x, y, z = map(float, line.split())
mx[x/0.005, y/0.005] = x
my[x/0.005, y/0.005] = y
mz[x/0.005, y/0.005] = z
mz = where(mz==0, -0.8, mz)
rc('font', **{'size':9})
fig = figure(figsize=(10, 10))
ax = p3.Axes3D(fig)
ax.plot_surface(mx, my, mz)
# ax.contourf3D(mx, my, mz)

show()
Это поверхность построенная по исходному файлу. Обращаю внимание на размерностьмассивов которые идут в surface. Т.е. для каждого прямоугольника поверхности 2 координаты Х и две У.
Выглядит не очень хорошо из-за того что много z=0, убрал их ниже поверхности на -0,8
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB