Вычислить результат списка для рекурсивных уравнений

У меня возникли проблемы с вычислением списка элементов для уравнения, которое в результате дает список элементов для второго уравнения, которое влияет на первое уравнение. Уравнения задаются как L1(i) = lamb1(i) * W1(i) и W1(i) = Q1(i-1)(R1/c1) + L1(i-1)(s1/c1), где список значения для баранины1 и Q1 уже известны, а начальное значение списка для L1(0) = W1(0) = 0.

c1 = 1
R1 = 4.58
s1 = 8.41
lamb1 = [0.0, 0.0072, 0.0145, 0.0216, 0.0287, 0.0357, 0.0426, 0.0494, 0.0561, 0.0626, 0.0689]
Q1 = [0.0, 0.0612, 0.1219, 0.1821, 0.2417, 0.3006, 0.3586, 0.4158, 0.4719, 0.5268, 0.5802]

L1 = [0]
W1 = [0]

for i,j in zip(lamb1,W1):
    L_1 = i * j
    L1.append(L_1)

for i,j in zip(Q1,L1):
    W_1 = (R1/c1) * i + (s1/c1) * j
    W1.append(W_1)

Когда это сделано, итерация для L1 останавливается на втором элементе, а для W1 на третьем элементе, поэтому я попробовал это:

for i,j in zip(lamb1,W1):
    L_1 = i * j
    print(L_1)
    L1.append(L_1)
    for i,j in zip(Q1,L1):
        W_1 = (R1/c1) * i + (s1/c1) * j
        W1.append(W_1)

Но затем добавление L_1 и W_1 портит будущие результаты.

Любые идеи о том, что происходит не так? Наверное это принципиальная ошибка, но я уже пару дней ломаю голову.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша ошибка в том, что L1 и W1 следует использовать только для хранения результатов. Они не нужны для расчета.

Это моя версия. Я использовал прописные имена для списков и строчные для элементов, чтобы избежать путаницы (i и j - плохой выбор, поскольку они обычно используются для целых чисел или счетчиков и не дают подсказок к их значению в формуле).

c1 = 1
R1 = 4.58
s1 = 8.41
LAMB1 = [0.0, 0.0072, 0.0145, 0.0216, 0.0287, 0.0357, 0.0426, 0.0494, 0.0561, 0.0626, 0.0689]
Q1 = [0.0, 0.0612, 0.1219, 0.1821, 0.2417, 0.3006, 0.3586, 0.4158, 0.4719, 0.5268, 0.5802]

L1 = [0.]
W1 = [0.]

w1=0.
l1=0.

for lamb1,q1 in zip(LAMB1[1:],Q1[:-1]):
    
    # calculation
    w1 = (R1/c1) * q1 + (s1/c1) * l1
    l1 = w1 * lamb1
    
    
    # storage
    L1.append(l1)
    W1.append(w1)

print(L1)
print(W1)

Это дает мне:

 [0.0, 0.0, 0.004064292, 0.012797626227552001, 0.027025241249665544, 0.047633377557075834, 0.07571488444386332, 0.11259001880174077, 0.1599549038606801, 0.21950832361591682, 0.29343194021091945]
[0.0, 0.0, 0.280296, 0.59248269572, 0.9416460365737124, 1.3342682789096871, 1.7773447052550075, 2.2791501781728902, 2.8512460581226398, 3.5065227414683195, 4.258809001609861]

Я думаю, что это неправильно, вы используете новый li вместо старого для w1, в формуле указано L1 (i-1), поэтому сначала следует вычислить w1, то же самое с LAMB1 и Q1, формулы их не используют в том же индексе, так что надо срать

Copperfield 09.12.2020 17:55

теперь вам также нужно инициализировать l1 перед циклом

Copperfield 09.12.2020 18:14

Плохо, я тестировал его в ноутбуке, не перезапуская ядро, поэтому не жалуюсь и на неправильную инициализацию. Исправленный.

manu190466 09.12.2020 18:18

другое дело, что q1 идет с R1 в расчете w1, я, наконец, замечаю это, когда смотрю, почему то, что вы сделали, не соответствует результатам того, что я сделал

Copperfield 09.12.2020 18:30

Другие вопросы по теме