2017-04-03 68 views
1

我試圖繪製一個具有不同行爲的函數,具體取決於x軸的值。對於x軸('ec'變量)小於2.0的值,它的行爲是單向的,對於大於這個值的值,它以另一種方式起作用。功能裏的'for'迭代的問題

import numpy as np 
import matplotlib.pyplot as plt 

ec = np.linspace(0., 3.,20) #range of 'x' axis values 

def ten_def(x): 
    for i in ec: 
     if i <= 2.: 
      return 0.85*x*(1-(1-(ec/2))**2) #behavior for ec < than 2.0 
     else: 
      return 0.85*x #behavior for ec > 2.0 

fcd = float(input('Fck (MPa): '))/1.4 

plt.plot(ec, ten_def(fcd), 'b-', ec,(ec*0)+fcd*0.85,'r-') 
plt.title('Tensão-deformação') 
plt.xlabel('Deformação (‰)') 
plt.ylabel('Tensão (MPa)') 
plt.show() 

代碼的繪圖部分正在工作。但是它繪製了一條曲線,它對於整個地塊具有相同的行爲(它始終在考慮EC < 2.0)。我究竟做錯了什麼?

how it is supose to be like

+0

第一次回來,這就是函數的結束。這就像給別人發送信使一樣。一旦使者被告知回覆給你答覆,任何其他答覆都是無用的,因爲使者已經離開了。 – zondo

回答

0

您必須返回數據的列表作爲函數的輸出。

import numpy as np 
import matplotlib.pyplot as plt 

ec = np.linspace(0., 3.,20) #range of 'x' axis values 

def ten_def(x): 
    result = [] 
    for i in ec: 
     if i <= 2.: 
      result.append(0.85*x*(1-(1-(i/2))**2)) #behavior for ec < than 2.0 
     else: 
      result.append(0.85*x) #behavior for ec > 2.0 
    return result 

fcd = float(input('Fck (MPa): '))/1.4 

plt.plot(ec, ten_def(fcd), 'b-') 
plt.axhline(0.85*fcd, color='r') 
plt.title('Tensão-deformação') 
plt.xlabel('Deformação (‰)') 
plt.ylabel('Tensão (MPa)') 
plt.show() 

這應該給你想要的結果

+0

它給了我「ValueError:設置一個序列的數組元素」。 – JohnEngineer

+0

@JohnEngineer嘗試新版本。看起來問題似乎是,當'ec <= 2'代替個別值時,整個'ec'被用於計算。 –

+0

這正是我想要的!謝謝! – JohnEngineer