Вложено для l oop. Сохранить переменную, когда условие выполнено - PullRequest
0 голосов
/ 18 марта 2020

Я новичок и не очень удобен с циклами и поэтому столкнулся с ошибкой, с которой я имел дело. Я приложил весь свой сценарий, но он касается моего вложенного для l oop. Моя цель здесь:

1) L oop через мой внутренний l oop n раз со значением "a".

2) Вернитесь к внешнему l oop, выберите новое значение и повторите.

Я имею в виду, что скрипт запускается. Это может быть не красиво, но проблема в том, что я хочу сохранить последнее значение L для каждого a. Прямо сейчас я верю, что перезаписываю его каждым внешним l oop.

Как мне получить Python для сохранения переменной. Я думаю что-то вроде:

, если я = n:

L [i] = Ln [i]

, но у меня не работает. Итак, как мне заставить Python сохранить переменную при выполнении условия?


    import numpy as np
import matplotlib.pyplot as plt
from math import exp # exponential function
from math import *

n = 1000    #Iterations (1000 years)
t = np.ones(n)
t[0] = 0    #Time(0)
dt = 1      #Time step

    ## Parameters ##
d0 = 200     #d0 (Start height)
s = 0.014   #Slope
lambd = 300     #lambda
sigma = 10000   
xs = 40000  #x-coordinate of the "bump"
ac = 0.0005 #Accumulation
alfaf = 0.7 #Constant
alfam = 2 #Constant
eps = 1     #Constant
delta = 1.127 #Constant
c = 2.4 #Calving rate


    ## Grids ##
x = np.linspace(0,50000,5000) #My x grid
x[0] = 200              #Start position of glacier's head
L = np.ones(n)          #Glacier Length
#L[0] = 47000
L[0] = 14000
B = np.zeros(n)
Hf = np.ones(n)         #Defining vectors to loop through
F = np.ones(n)
dLdt = np.zeros(n)
ak = np.arange(0+2/n, 2+2/n, 2/n) #Store a as a vector

for a in np.arange(0+2/n, 2+2/n, 2/n):
    for i in range(1, n):
        t[i] = i
        x[i] = d0-s*L[i-1]+lambd*np.exp(-((L[i-1]-xs)/(sigma))**2) #Bed geometry
        B[i] = a*L[i-1]    #Surface mass balance
        Hf[i] = np.max([alfaf*np.sqrt(L[i-1]), -eps*delta*x[i-1]]) #Ice thickness at glacier front
        F[i] = np.min([0, c*x[i-1]*Hf[i-1]])    #Flux of ice at the glacier front
        dLdt[i] = (2*(B[i-1]+F[i-1]))/(3*alfam*np.sqrt(L[i-1])) #Differential equation
        L[i] = L[i-1] + 1*dLdt[i-1]     #Updating L with Eulers Method


1 Ответ

0 голосов
/ 18 марта 2020

Если я понимаю, «Я хочу сохранить последнее значение L для каждого а» правильно. Создайте новую переменную списка с именем L_last. Добавить к этому значению на последней итерации каждой внутренней l oop.

Это должно "сохранить последнее значение L для каждого a".

L_last = []
for a in np.arange(0+2/n, 2+2/n, 2/n):
    for i in range(1, n):
        .... all your code
        L[i] = L[i-1] + 1*dLdt[i-1]
        if i == n - 1:
            L_last.append(L[i])

Так что L_last будет имеют длину, равную числу итераций внешних l oop .. то есть (2+2/n)-2/n)/(2/n) значений.

Надеюсь, что поможет

...