2012-03-17 15 views
3

私はプログラミングが新しく、Python 2.7 IDLEで単純なゼロ次元エネルギーバランスモデルを作成して、地球の表面温度を計算しようとしています氷アルベドフィードバックを追加しました。すなわち、モデルの温度出力が280Kより高い場合、アルベドは0.3(30%エネルギー反映)に留まり、アルベドが250k未満であれば0.7地球上のより大きな氷(白い)カバー)、そして温度がこれらの間の範囲にある場合、アルベドは式で計算されます。この新しいアルベド値は、より正確な温度を得るためにモデルから戻ってくる。Python:フィードバック機構を含むモジュールのグラフを作成する

私のモジュールで私は定義しました。

アルベド conciderationに入れ、新たなアルベド(複数可)を使用して新しい確定気候モデルの最終的な気候モデル 計算私が変えた最初の気候モデルの出力を比較するグラフを作成しようとしています

ソーラー出力を変化させて2回目の出力に出力することができます。しかし、間違いを続けてください。

これは私のグラフのために私のスクリプトです:

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 

助けを歓迎します

おかげ

+1

@cillosisを - なぜ?科学者はプログラマではありません...実際のエラーに関しては、numpy配列(例えば 'x> 5')の条件は単一の値ではなく、boolean配列(例えば' array([True、True、False] –

答えて

1

上記のコメントが正しいか、そしてそれはあなたが何をしたいのか明確ではないですが、あなたは、アレイ内のすべての要素が条件を検証するかどうかを確認したい場合は、あなたが行うことができます:

if tb.all() > 280.0: 

あなたはそれをfullfills配列の値が存在する場合に興味があるなら、あなたは何ができる:

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

どちらも上記の例は、第三の条件のためのシンプルな他の文よりもする必要はありません。最初の条件が適用される場合のために、補数秒間tb_test配列のものを行います

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

あなたはあなたにも、個別に位置を可能性を評価するために、その後私は、次のために行くだろうしたい場合3番目は3つです。あなたの計算を挿入することができ、もちろん、直接の代わりに、異なる条件が適用される場合の上記識別

...

関連する問題