*の後の引数は、浮動小数点数ではなく、相互関係でなければなりません

2020-08-01 python numpy

この問題の診断に苦労しています。 *の場所に問題があると思いましたが、運がありませんでした。次に、それは私の呼び出し関数の括弧の問題だと思いましたが、運もありませんでした。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve

def Psat(T,*args):
    '''
    Calculate the saturation pressure of a component.
    '''
    return 10**(args[0] - args[1]/(T + args[2]))

def dew_pt(T,*args):
    '''
    This will calculate the dew point temperature of a binary system.
    '''
    return (y*P)/Psat(T,*args[0]) + ((1-y)*P)/Psat(T,*args[1]) - 1

def bubble_pt(T,*args):
    '''
    This will calculate the bubble point temperature of a binary system.
    '''
    return (x*Psat(T,*args[0]))/P + (1-x)*Psat(T,*args[1])/P - 1

def plot(dew,bubble):
    '''
    Plotting the dew point and bubble point on a graph.
    '''
    fig = plt.figure(figsize=(60,60))
    plt.plot(x,dew, 'r-',label = 'Dew Point')
    plt.plot(x,bubble, 'b-', label = 'Bubble Point')
    plt.legend(loc = 'best')
    plt.xlabel('Composition')
    plt.ylabel('Temperature $^\circ$C')
    plt.show()
    return fig

#Constants
P = 760 #Units: mmHg
liquid_comp = np.linspace(0,1,101)
vap_comp = np.linspace(0,1,101)

#Antoine Constants A, B, C
Ben_Con = (6.91, 1211, 221)
Tol_Con = (6.95, 1344, 219)

dew = []
for y in vap_comp:
    ans = fsolve(dew_pt,25,*(Ben_Con,Tol_Con))
    dew.append(ans)

エラーは以下のとおりです

  File "C:\Users\ayubi\Documents\Python Files\Chemical Engineering Files\Txy.py", line 22, in dew_pt return (y*P)/Psat(T,*args[0]) + ((1-y)*P)/Psat(T,*args[1]) - 1 TypeError: Psat() argument after * must be an iterable, not float 
  File "C:\Users\ayubi\Documents\Python Files\Chemical Engineering Files\Txy.py", line 22, in dew_pt return (y*P)/Psat(T,*args[0]) + ((1-y)*P)/Psat(T,*args[1]) - 1 TypeError: Psat() argument after * must be an iterable, not float 
 
  File "C:\Users\ayubi\Documents\Python Files\Chemical Engineering Files\Txy.py", line 22, in dew_pt return (y*P)/Psat(T,*args[0]) + ((1-y)*P)/Psat(T,*args[1]) - 1 TypeError: Psat() argument after * must be an iterable, not float 
 

私はそれが簡単な修正であると確信しています、私は解決策を見つけることができません。

ありがとう!

Answers

エラーは問題を正確に伝えます。 float args[0] *を使用しているのは、これをイテラブル(リストやタプルなど)でのみ使用できる場合です。

Psat()見てください。

def Psat(T,*args):
    '''
    Calculate the saturation pressure of a component.
    '''
    return 10**(args[0] - args[1]/(T + args[2]))

これは、 argsをリストとして使用していることを示しています。 args*argsとして宣言されています。これは、関数への残りの引数をリストにまとめていることを意味します。

つまり、 Psat()を呼び出すときは、4つの合計パラメーターを渡す必要があります。

Psat(T, x, y, z)

一般的なショートカットは、パラメータとしてイテラブルを「スプラット」することです。パラメータを含むリストがある場合、次のことができます

Psat(T, *args)

ここにはインデックスがないことに注意してください。 argsからPsatすべての値を渡すだけPsat

だから私はそれを理解することができました!わーい!

リードのために@hpauljへの小道具。

問題は本質的にfsolve関数の呼び出しでした

私はfsolve関数を次のように呼び出すと仮定しました

ans = fsolve(dew_pt, 25, args = (Ben_Con, Tol_Con)

ない

ans = fsolve(dew_pt, 25, (Ben_Con, Tol_Con))

これは、 fsolveのドキュメントによると、タプルとして渡すパラメーターがいくつかあり、どのタプルを何を指定するかを指定する必要があるためです。

私はそれが簡単な修正であることを知っていました、(:

助けてくれてありがとう!

Related