#python #plot
#python #сюжет
Вопрос:
Я использую odeint для решения системы из 6 уравнений. Затем я хочу сохранить свое решение в переменной x6a, y6a, z6a, x6b, y6b, z6b со строкой:
x6_a, y6_a, z6_a, x6_b, y6_b, z6_b = sol6.y
но на этом этапе мой код начинает сбоить из-за ошибки:
'dict' object has no attribute 'y'
Вот минимальный воспроизводимый пример моего кода:
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def coupled_jac(X, t, sigma, r, b, C1, C1x, S, O, C2, C2x, tau):
jac = np.array([[-sigma, sigma, 0, -C1*X[3], 0, 0], [r X[2], -1, -X[0], 0, C1*S, 0], [X[1], X[0], -b, 0, 0, C1x*S], [-tau*C2, 0, 0, -tau*sigma, tau*sigma, 0], [0, tau*C2, 0, tau*r-S*X[5], -r*tau, -tau*S*X[3]], [0, 0, tau*C2x, tau*S*X[4], tau*S*X[3], -b*tau]])
return jac
def lorenz_coupled(X, t, sigma, r, b, C1, C1x, S, O, C2, C2x, tau):
rhs = [sigma * (X[1] - X[0]) - C1 * (S*X[3] - O), r*X[0] - X[1] - X[0]*X[2] C1 * (S*X[4] - O), X[0]*X[1] - b*X[2] C1x*S*X[5], (sigma * (X[4] - X[3]) - C2 * (X[0] O)) * tau, (r*X[3] - X[4] - S*X[3]*X[5] C2 * (X[1] O)) * tau, (S*X[3]*X[5] - b*X[5] C2x*X[2]) * tau]
return rhs
#Initial conditions
X0 = np.array([1, 1, 1, 1, 1, 1])
#maiximum time
t_max = 50
t = np.linspace(0, t_max, 1000*t_max 1)
#parameters
sigma = 10
r = 28
b = 8/3
tau = 0.1
S = 0.5
C1 = 1
C2 = 1
C1x = 1
C2x = 1
O = -11
#solve function
X, sol6 = odeint(lorenz_coupled, X0, t, args=(sigma, r, b, C1, C1x, S, O, C2, C2x, tau), Dfun=coupled_jac, full_output=True)
x6_a, y6_a, z6_a, x6_b, y6_b, z6_b = sol6.y
# time
t = np.linspace(0, t_max, 10*t_max 1)
fig = plt.figure(figsize=(16, 8)) #specify the size of plot
ax = fig.add_subplot(1, 2, 1, projection='3d')
#plot the fast equations
ax.plot(x6_a, y6_a, z6_a)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.title("The Fast Coupled Lorenz Attractor")
#plot the slow coupled equations
ax = fig.add_subplot(1, 2, 2, projection='3d')
ax.plot(x6_b, y6_b, z6_b)
#title and axis label
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.title("The Slow Coupled Lorenz Attractor")
Комментарии:
1. Что это за функция odeint? возвращает ли он словарь? Попробуйте sol6 [«y»]
2. Это означает, что
odeint
возвращает dict в качестве второго возвращаемого значения , и вы пытаетесь получить доступ.y
к dict, а этого не существует.3. @Mammadli odeint — это функция, которая решает системы дифференциальных уравнений. Боюсь, это не работает с sol6 [«y»].
4. @deceze хорошо, спасибо! Знаете ли вы, что будет работать вместо этого?
Ответ №1:
Примечание 0
Некоторые ошибки сложнее понять, чем другие.
Я собираюсь немного «поиграться» с вами, потому что большинство программистов поймут ваше сообщение об ошибке ( dict has no attribute named 'y'
)
Пожалуйста, простите меня, если следующее обсуждение кажется «слишком простым» или упрощенным.
Примечание 1
Следующий код выдаст ту же ошибку, что и ваш код:
sol6 = dict()
z = sol6.y
Полученное вами сообщение об ошибке было:
'dict' object has no attribute 'y'
Легче определить, какую ошибку вы допустили в своем программировании, если вы удалите весь посторонний код.
Всякий раз, когда скрипт python не работает, очень полезным подходом является:
- Сохраните резервную копию вашего кода.
- Скопируйте и вставьте ваш скрипт python в новый файл
- удалите небольшой фрагмент кода
- повторно запустите скрипт
- действуйте на основе изменений в сообщении об ошибке:
a. Если ошибка исчезнет: * вставьте удаленный код обратно. * Затем перейдите к шагу 3 (удалить код)
b. Если отображается то же сообщение об ошибке, продолжайте удалять код (перейдите к шагу 3).
Цель состоит в том, чтобы «стереть» весь код, пока не останется только ошибка.
Если ваш скрипт состоит из сотен строк, слишком сложно найти ошибку.
Попробуйте создать как можно меньшее количество кода на python, который воспроизводит одно и то же сообщение об ошибке.
Примечание 2
Why you have an error is very obvious to programmer comfortable with using something called a «class«.
The dictionary class has no member variables or methods, named «
y
«
You would have almost the same error in C , Java, or any other language, not just Python.
A «class» represents a complex thing, such as a human person.
The «member variables» of a class record short simple facts about the more complicated «class»
A first name is an example of a good member variable for a Person
class
A class is like a fill-in-the-blank sheet which records small facts.
For example, a JobApplicant
class might have:
- a job applicant’s first name
- an applicant’s last name
- an applicant’s age
- an applicant’s phone number
- a job applicant’s email address.
- etc…
Suppose that someone is writing code for a website where people buy and sell houses. You might write a class named House
which stores statistics about a house for sale:
class House:
* number of bedrooms
* number of bathrooms
* square footage of the house
* asking price to buy the house
* mailing address/location of the house
* etc...
A class’s member variables are usually things (not actions), such as:
- mass
- velocity
- color
- temperature
class «methods» are functions for manipulating the member variables. Nethods are actions, such as:
- change_first_name
- change_phone_number
- delete
- insert
- rotate
- reflect
- translate
- увеличенный
- сжать
ЧТО ТАКОЕ «ЭКЗЕМПЛЯР КЛАССА» или «ОБЪЕКТ»?
Ниже приведены некоторые словарные слова:
- экземпляр класса
- объект класса
- объект
Все приведенные выше термины означают одно и то же.
Экземпляр класса похож на приложение для работы, в котором будет заполнена вся информация.
Экземпляр / объект приложения для работы может указывать «имя», а также «Сара»
КЛАСС
Класс похож на бумажную форму заявки на работу, которая еще не была заполнена.
Класс говорит «имя», и есть пустая строка.
Класс обычно НЕ указывает, какое на самом деле имя человека (Робби, Джон, Сара, Ян, Фред и т. Д.)
Псевдокод для классов:
Следующее — «псевдокод«.
псевдокод легче читать, чем python.
Если английский находится на одном конце спектра, а python — на другом конце спектра, то «псевдокод» находится где-то в середине спектра.
begin class named `Rectangle`:
begin member variables:
integer my_length;
integer my_width;
end of member variables.
begin methods:
def get_area():
return my_length * my_width;
end of methods.
end of class named 'Rectangle'
Рассмотрим следующий псевдокод:
Robby = Rectangle(4, 8);
w = Robby.my_width;
Я переведу приведенный выше код на английский:
- Создайте новый прямоугольник, имеющий
width = 4
иlength = 8
- сохраните новый прямоугольник в гостиничном номере с именем
Robby
- получить
my_width
переменную изRobby
- Поместите
my_width
переменную изRobby
Обратите внимание, что код, подобный следующему:
Robby.my_width
Robby.get_width()
означает «получить ширину Robby» на английском языке.
Что-то вроде x = Robby.favorite_ice_cream_flavor
не имеет смысла, потому что прямоугольники не имеют *** любимого вкуса мороженого.
Напомним, что Robby
это прямоугольник.
Ваш код выглядит примерно так:
this_dict = {
"brand": "Ford",
"model": "Mustang",
"year": 1964
}
blah = this_dict.y
Словари, такие как this_dict
, НЕ имеют имен переменных-членов y
Словарь похож на таблицу входных и выходных данных:
------- ---------
| INPUT | OUTPUT |
------- ---------
| A | APPLE |
| B | BANANA |
| C | CHARLIE |
------- ---------
------- --------
| INPUT | OUTPUT |
------- --------
| x | 54.1 |
| y | 15.3 |
| z | 99.3 |
------- --------
Словарь по сути является «справочной таблицей».
Вы выполняете поиск в столбце ввода для определенного ввода.
Затем вы следуете строке, чтобы увидеть, каков результат.
«Словарь» python очень похож на конечную функцию из математики.
Есть входные данные и выходные данные.
Словари Python очень ограничены. Старайтесь, чтобы количество элементов было меньше 10,000
even 10,000
немного раздвигает границы.
«Функции» компьютерного программирования не похожи ни на функции из класса math, ни на словари.
«Функция» компьютерного программирования похожа на рецепт кулинарной книги.
«Функция» компьютерного программирования объясняет, как испечь пирог.
«Функция» компьютерного программирования не очень конечна (возможно бесконечно много входных данных)
В любом случае, в словарях python нет атрибута с именем y
по той же причине, по которой прямоугольники не имеют атрибута с именем favorite flavor of ice-cream
. Это не имеет никакого смысла.
Основное различие между «словарем» и «массивом» заключается в том, что:
- входные данные в массив всегда являются целыми числами 1, 2, 3, …. n
- входными данными для словаря могут быть целые числа, но они могут быть и другими вещами, такими как английские слова: «красный», «синий», «оранжевый».
Below is an example of how to create dictionary, and how to use it afterwards:
student_grades = {
"Joe McCormic": 95.7
"Lance Armstrong": 87.4,
"Sarah McPherson": 99.83
"Kenneth Moer": 77.1
}
def number_to_letter(number: float):
number = float(number)
if number > 90:
return "-A"
return "F"
# if number <= 90
# return "F"
Joe_McCormic_number = student_grades["Joe McCormic"]
print("Joe_McCormic_number = ", Joe_McCormic_number)
Joe_McCormic_letter_grade = number_to_letter(Joe_McCormic_number)
Anyway, dictionaries do not have an attribute named y
.
Attributes always go to the right of the dot ( .
):
object.attribute
my_house.number_of_bedrooms
Sarah.first_name
Sarah.phone_number
my_car.year_of_manufacter
Below is a list of some of the attributes which a dictionary does have:
y
is not a valid dictionary attribute.
clear()
deletes/clears all of the elements from the dictionary.
car_dict = { # "brand": "Ford", # "model": "Mustang", # "year": 1964 # } # # print(len(car_dict)) # prints '3' car_dict.clear() # deletes everything from the dictionary print(len(car_dict)) # prints '0'
__len__()
«len» означает «длина«.__len__()
Метод выводит длину словаря. Другими словами, он выводит количество разрешенных входных данных в словарь.
car_dict = { # "brand": "Ford", # "model": "Mustang", # "year": 1964 # } # # print(len(car_dict)) # prints '3' print(car_dict.__len__()) # equivalent to the above
copy()
Возвращает копию словаря.new_dict = old_dict.copy()
fromkeys()
Возвращает словарь с указанными ключами и значениемget()
Возвращает значение указанного ключаitems()
Возвращает список, содержащий кортеж для каждой пары ключ-значениеkeys()
Возвращает список, содержащий ключи словаряpop()
Удаляет элемент с указанным ключомpopitem()
Удаляет последнюю вставленную пару ключ-значениеsetdefault()
Возвращает значение указанного ключа. Если ключ не существует: вставьте ключ с указанным значениемupdate()
Обновляет словарь указанными парами ключ-значениеvalues()
Возвращает список всех значений в словаре
Две нижние строки в следующем фрагменте кода эквивалентны:
d = dict()
d["ham"] = 83
# The following two lines are equivalent:
x = d["ham"]
x = d.__getitem__("ham")
Я просто пытаюсь показать, что все, что связано со словарями, связано с доступом к атрибутам словаря. Даже []
оператор на самом деле является просто __getitem__
атрибутом.
У словаря с именем нет атрибута y
d = dict()
temp_var = d.y
ОШИБКА
AttributeError: 'dict' object has no attribute 'y'
Комментарии:
1. это было невероятно полезно — большое вам спасибо!! Я думаю, что теперь я понимаю, что на самом деле означает моя ошибка. Есть ли способ узнать, какие атрибуты существуют в моем словаре? Поскольку я все еще пытаюсь построить свои результаты. Еще раз спасибо за вашу помощь