Python: создание графика модуля, содержащего механизм обратной связи.

Я новичок в программировании и пытаюсь создать простую модель нулевого энергетического баланса в Python 2.7 IDLE, чтобы рассчитать температуру поверхности Земли и добавить обратную связь по ледяному альбедо, т.е. если выходная температура модели выше 280K, альбедо остается на уровне 0,3 (30% отраженной энергии), если ниже 250K, альбедо составляет 0,7 (70% отраженной энергии, так как она холоднее, поэтому на Земле больше ледяной (белый) покров), и если температура находится в диапазоне между ними; альбедо рассчитывается по формуле. Это новое значение альбедо затем возвращается из модели, чтобы получить более точную температуру.

В моем модуле я определил;

Окончательная модель климата. Расчет альбедо. Новая завершенная модель климата с учетом нового альбедо.

Я пытаюсь создать график для сравнения результатов первой климатической модели с различным солнечным входом, но постоянным альбедо, с выходом второго прогона с различным альбедо и солнечным светом. Но продолжайте получать ошибки;

Это мой скрипт для моего графика:

  import matplotlib.pyplot as plt
  import numpy as np
  from EBM_IceAlbFeedback import *
  # q is for the Solar Constant
  q=np.linspace(2.5e26,4.0e26,150)
  # t= temperature derived from the final climate model
  t= finalCM(Q=q)
  plt.plot(q,t,'b-')
  q=np.linspace(3.0e26,4.5e26,150)
  # tb= is the second set of temperatures derived from the NEWfinalCM which contains an Ice Albedo Feedback
  tb= NEWfinalCM(Q=q)
  plt.plot(q,tb,'r-')
  plt.show ()

Мое сообщение об ошибке:

Traceback (most recent call last):
 File "K:/python/CompareCMsPlt2.py", line 13, in <module>
tb= NEWfinalCM(Q=q)
 File "K:/python\EBM_IceAlbFeedback.py", line 228, in NEWfinalCM
 NewAlb=NAlb(dist=dist, Q=Q, co2Emissions=co2Emissions, alpha=alpha, cCycleInt=cCycleInt, cCycleSlope=cCycleSlope)
 File "K:/python\EBM_IceAlbFeedback.py", line 190, in NAlb
  if ta>280.0:
 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Я считаю, что это относится к этой части моего модуля:

def NAlb (dist=150e9, Alb=0.3, Q=3.87e26, co2Emissions=0.0, alpha=3.0, cCycleInt=0.4,    cCycleSlope=0.0001):
'''
Readjusting Albedo to the output temperature

Arguments:

Q = solar ouput (W)
dist = distance from the sun (m)
co2Emissions = Cumulative CO2 emissions since 2010 (GtC)
alpha = climate sensitivity (K/2xCO2)
cCycleInt = Initial value of the airborne fraction (unitless)
cCycleSlope = Increment the airborne fraction per GtC (GtC^-1)

Return Value:
NewAlb= New Albedo (Unitless)
'''
# CALCULATE ABORTIVITY:
#Our model is baselined at an atmospheric CO2 concentration of 390 ppmv in 2010
baselineCO2=390.0
#The official IPCC figure for conversion of mass of emissions (GtC) top atmospheric   concentration (ppmv)
IPCCmassToConc=2.12
#approximate correction for the carbon cycle:
cCycleAdjust=cCycleInt+cCycleSlope*co2Emissions
#convert GtC to CO2 conc in ppmv:
co2=co2Emissions*cCycleAdjust/IPCCmassToConc+baselineCO2
#calculate absorptivity
absrp=absrpFromCO2( CO2=co2, alpha=alpha )

#CALCULATE TEMPERATURE: using the same method as in the finalCM
ta=transATmCM (absrpt=absrp, dist=dist, Alb=0.3, Q=Q)
# define the thresholds for an ice free state.
if ta>280.0:
    NewAlb=0.3
# define the threshold for a snow ball Earth state.
elif ta<250.0:
    NewAlb=0.7# Calculate albedo for temperatures between 280k to 230k
elif 250.0<ta<280.0:
    NewAlb=(0.3+(((0.7-0.3)/(280.0-250.0))*(280.0-ta)))
return NewAlb




  def NEWfinalCM( co2Emissions=0.0, alpha=3., dist=150e9, Q=3.87e26, cCycleInt=0.4, cCycleSlope=0.0001 ):
'''
A New final Climate model which contains and Ice Albedo Feedback

Arguments:

Q = solar ouput (W)
dist = distance from the sun (m)
co2Emissions = Cumulative CO2 emissions since 2010 (GtC)
alpha = climate sensitivity (K/2xCO2)
cCycleInt = Initial value of the airborne fraction (unitless)
cCycleSlope = Increment the airborne fraction per GtC (GtC^-1)

Return Value:
tn = surface temperature (K)
'''
#Our model is baselined at an atmospheric CO2 concentration of 390 ppmv in 2010
baselineCO2=390.0
#The official IPCC figure for conversion of mass of emissions (GtC) top atmospheric concentration (ppmv)
IPCCmassToConc=2.12
#approximate correction for the carbon cycle:
cCycleAdjust=cCycleInt+cCycleSlope*co2Emissions
#convert GtC to CO2 conc in ppmv:
co2=co2Emissions*cCycleAdjust/IPCCmassToConc+baselineCO2


#calculate temperature
absrp=absrpFromCO2(CO2=co2, alpha=alpha)
NewAlb=NAlb(dist=dist, Q=Q, co2Emissions=co2Emissions, alpha=alpha, cCycleInt=cCycleInt, cCycleSlope=cCycleSlope)

tn=transATmCM( absrpt=absrp, dist=dist, Alb=NewAlb, Q=Q)


return tn

Любая помощь приветствуется

Спасибо


person user1275134    schedule 17.03.2012    source источник
comment
@cillosis - Почему? Ученые не программисты ... Что касается фактической ошибки, условия для пустых массивов (например, x > 5) возвращают логические массивы (например, array([True, True, False]), а не одно значение.   -  person Joe Kington    schedule 17.03.2012


Ответы (1)


Комментарий выше правильный, и неясно, что вы хотите сделать, но если вы хотите проверить, все ли элементы в вашем массиве подтверждают условие, вы можете сделать:

if tb.all() > 280.0:

Если вас интересует, существует ли значение в массиве, которое его заполняет, вы можете сделать:

if tb.max() > 280.0:
    ...
elif tb.min() < 250.0:

Оба вышеприведенных примера не должны быть чем-то большим, чем простым оператором else для третьего условия.

Если вы хотите оценивать позиции по отдельности, вы также можете это сделать, но тогда я бы сделал следующее:

tb_test = np.ones(tb.shape) * 3
tb_test[np.where(tb > 280)] = 1
tb_test[np.where(tb < 250)] = 2

Это сделает массив tb_test единицами для первого условия, двойками для второго и тройками для третьего.

Конечно, вы можете вставить свои расчеты напрямую вместо приведенного выше определения того, где применяются различные условия...

person deinonychusaur    schedule 19.03.2012