Не используйте quad
для функции, которая возвращает список из двух функций - вместо этого дважды используйте две функции для двух функций, а затем составляйте результаты в список. Документация для scipy.integrate.quad дает возможные сигнатуры для интегрируемой функции, и каждая сигнатура показывает, что функция должна возвращать значение double
(называемое float
в Python), а не список.
Если вы не можете изменить определения time_start
или fun
или параметры или возвращаемое значение integral
, вы можете использовать этот код.
from math import cos, sin
from scipy.integrate import quad
# Global variables and constants used in function `integral`
time_start = 0
fun = lambda time: [cos(time), sin(time)]
# The desired function
def integral(time):
"""Return a list of two items containing the integrals of the two
components of the `fun` function from `start_time` to `time`.
"""
def fun0(time):
return fun(time)[0]
def fun1(time):
return fun(time)[1]
integral0 = quad(fun0, time_start, time)[0]
integral1 = quad(fun1, time_start, time)[0]
return [integral0, integral1]
Тогда результатом утверждения
print(integral(0), integral(pi/2), integral(pi))
является
[0.0, 0.0] [0.9999999999999999, 0.9999999999999999] [3.6775933888827275e-17, 2.0]
, что вы хотите, с точностью до ошибки.
путь, используя выражение lambda
для создания функции, тогда присвоение имени имени считается плохой практикой программирования в Python. См. здесь , пятый пункт. Вместо этого используйте обычный блок def
:
def fun(time):
return [cos(time), sin(time)]
def integral(time):
# as shown above
Конечно, использование time_start
и fun
в качестве глобальных переменных, а не как параметры integral
, также является плохой практикой, но я придерживался того, как вы их использовали.
Со страницы Википедии Модель Эрдеша – Реньи :
В модели G (n, p) граф строится путем случайного соединения узлов. Каждое ребро входит в граф с вероятностью p, не зависящей от любого другого ребра.
blockquote>Чтобы создать граф ER на основе заранее определенного набора узлов, вам просто нужно сделать следующее:
- Создать пустой ненаправленный
networkx.Graph
.- Добавьте узлы на график.
- Выполните итерацию по всем возможным ребрам (то есть по всем парам узлов) и добавьте ребро в граф с вероятностью
p
.Вот некоторый псевдокод python-ish, чтобы дать вам идею:
import random import networkx as nx from itertools import combinations # probability for an edge to exist p = 0.5 # ASSUMPTION: This array contains all desired nodes nodes = [...] g = nx.Graph() g.add_nodes_from(nodes) for u, v in combinations(g, 2): if random.random() < p: g.add_edge(u, v)
Это должно дать вам совершенно корректный граф ER, использующий заранее определенный набор узлов. Обратите внимание, что этот метод не будет особенно эффективен для генерации массивных графов.