Advertisement
Guest User

Probability long term strength model

a guest
Jul 2nd, 2015
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.43 KB | None | 0 0
  1. import math
  2. import operator
  3. import numpy as np
  4. from sklearn import linear_model
  5. import numpy as np
  6. from scipy.stats import norm
  7. import matplotlib.pyplot as plt
  8. import numpy as np
  9. from scipy.optimize import curve_fit
  10. from numpy import arange,array,ones,polyfit,polyval#,random,linalg
  11. from pylab import plot,show,figure,legend
  12. from scipy import stats
  13. import math
  14. #
  15. #
  16. # stress = [70, 70, 70, 70, 70, 45, 45, 45, 300, 300, 300, 300,\
  17. #           300, 300, 300, 300, 300, 300, 200, 200, 200, 200, 200]
  18. # temperature = [523, 523, 523, 523, 523, 573, 573, 573, 423,\
  19. #                423, 423, 423, 423, 423, 423, 423, 423, 423, 473, 473, 473, 473, 473]
  20. # time = [254, 253, 255, 256, 252, 160, 162, 158, 165, 155, 157,\
  21. #         163, 164, 156, 153, 167, 155, 165, 17.3, 17, 16.7, 17.5, 16.5]
  22. import pandas as pd
  23.  
  24. parameters = ['Stress', 'Temperature', 'MinimumCreepRate', 'Priorplasticdeformation', 'Durationofprimarycreep',\
  25.               'Timetothirdcreepperiod', 'Timetorupture','Deformation', 'Time', 'MinimumCreepRate2', 'Time3',    'MinimumCreepRate3']
  26.  
  27. path = "C:\\PostGraduate\\Experiments_new.csv"
  28.  
  29. def read_csv():
  30.     data = pd.read_csv(path, sep=',',
  31.                           names=parameters, skiprows=1).astype('float')
  32.     return data
  33.  
  34. def process_calc():
  35.     data = read_csv()
  36.     result = {}
  37.     n, h, a0 = get_first_params(data, result)
  38.     l = get_l(data, result)
  39.     m, p, b0 = get_second_params(data, result)
  40.     data['a'] = (data['MinimumCreepRate2'] / (data['Stress'].pow(n) * np.exp(-h/data['Temperature'])))
  41.     data['b'] = (1/((l+1)*data['Timetorupture']*np.exp(-p/data['Temperature'])*data['Stress'].pow(m)))
  42.     data['def_first'] = data['MinimumCreepRate2'] * data['Durationofprimarycreep']
  43.     # data['teta'] = data['a'] * np.exp(-h/data['Temperature']) * data['Stress'].pow(n) * data['Durationofprimarycreep']
  44.  
  45.     temp = 1-(l+1) * data['b'] * np.exp(-p/data['Temperature']) * data['Stress'].pow(m) * data['Durationofprimarycreep']
  46.     data['temp'] = temp
  47.     data['teta'] = data['a'] * np.exp((p-h)/data['Temperature']) * data['Stress'].pow(n-m) * \
  48.                    ( data['temp'].pow((l - n +1) / (l + 1)) - 1) / (data['b'] * (n - l - 1))
  49.  
  50.     return result, data
  51.  
  52. def get_first_params(data, result):
  53.     x1 = np.log(data['Stress'])
  54.     x2 = - data['Temperature'].pow(-1)
  55.     y = np.log(data['MinimumCreepRate2'])
  56.     # linregress doesn't do multi regression, so we use sklearn
  57.     x = np.vstack([x1, x2]).T # don't need ones for
  58.     regr = linear_model.LinearRegression()
  59.     regr.fit( x, y )
  60.     coef = regr.coef_
  61.     intercept = regr.intercept_
  62.     result['a0'] = np.exp(intercept)
  63.     result['n'] = coef[0]
  64.     result['h'] = coef[1]
  65.     return coef[0], coef[1], np.exp(intercept)
  66.  
  67. def get_l(data, result):
  68.     n = result['n']
  69.     a0 = result['a0']
  70.     h = result['h']
  71.     data['Minus_Temperature_reverse'] = - data['Temperature'].pow(-1)
  72.     data['l'] = n - 1 + n/((data['Deformation']/\
  73.                             (a0*np.exp(h*data['Minus_Temperature_reverse'])*data['Stress'].pow(n)*data['Timetorupture'])) - 1)
  74.     l = data['l'].mean()
  75.     result['l'] = l
  76.     return l
  77.  
  78. def get_second_params(data, result):
  79.     x1 = - np.log(data['Stress'])
  80.     x2 = data['Temperature'].pow(-1)
  81.     y = np.log(data['Timetorupture'])
  82.     l = result['l']
  83.     # linregress doesn't do multi regression, so we use sklearn
  84.     x = np.vstack([x1, x2]).T # don't need ones for
  85.     regr = linear_model.LinearRegression()
  86.     regr.fit( x, y )
  87.     coef = regr.coef_
  88.     intercept = regr.intercept_
  89.     result['b0'] = np.exp(-intercept)/(l+1)
  90.     result['m'] = coef[0]
  91.     result['p'] = coef[1]
  92.     return coef[0], coef[1], np.exp(-intercept)/(l+1)
  93.  
  94.  
  95. def get_characteristics(data):
  96.  
  97.     means = []
  98.     stds = []
  99.     stresses = []
  100.     temperatures = []
  101.     for k, group in data.groupby(['Stress', 'Temperature']):
  102.         stress = k[0]
  103.         temperature = k[1]
  104.         data = group['b']
  105.         # mean = data.mean()
  106.         mean, std = norm.fit(data)
  107.         # var = data.var()
  108.         print('stress = ', stress, 'temperature = ', temperature, \
  109.               'mean = ', mean, 'std = ', std)
  110.         stresses.append(stress)
  111.         temperatures.append(temperature)
  112.         means.append(mean)
  113.         stds.append(std)
  114.     return stresses, temperatures, means, stds
  115.  
  116. def get_params_multiple_regressions(depend_var1, depend_var2, independ_var):
  117.     x = np.vstack([depend_var1, depend_var2]).T # don't need ones for
  118.     regr = linear_model.LinearRegression()
  119.     regr.fit(x, independ_var)
  120.     return regr.coef_, regr.intercept_
  121.  
  122. def get_params_multiple_regressions_many(depend_var1, depend_var2, independ_var):
  123.     # depend_var1 - stress
  124.     # depend_var2 - temperature
  125.     depend_var1_sq = [dep*dep for dep in depend_var1]
  126.     depend_var2_sq = [dep*dep for dep in depend_var2]
  127.     depend_var1_var2_sq = [depend_var1[index]*depend_var2[index] for index in range(len(depend_var1))]
  128.     x = np.vstack([depend_var1_sq, depend_var2_sq, depend_var1_var2_sq, depend_var1, depend_var2]).T # don't need ones for
  129.     regr = linear_model.LinearRegression()
  130.     regr.fit(x, independ_var)
  131.     return regr.coef_, regr.intercept_
  132.  
  133. def get_value_by_params(coefficient, intercept, params):
  134.     summa = 0
  135.     for i in range(len(coefficient)):
  136.         summa+=params[i]*coefficient[i]
  137.     summa+=intercept
  138.     return summa
  139.  
  140. def calculate_time(mean_b, std_b, result, stress, temperature):
  141.     from numpy import random
  142.     r = random.normal(mean_b, std_b, size = 1000)
  143.     return 1/((result['l']+1)*r*np.exp(-result['p']/temperature)*math.pow(stress, result['m']))
  144.  
  145. def plot_graphs(time):
  146.     plot_pdf(time)
  147.     plot_cdf(time)
  148.  
  149. def plot_pdf(time):
  150.     mu, std = norm.fit(time)
  151.  
  152.     # Plot the histogram.
  153.     plt.hist(time, bins=25, normed=True, alpha=0.6, color='g')
  154.  
  155.     # Plot the PDF.
  156.     xmin, xmax = plt.xlim()
  157.     x = np.linspace(xmin, xmax, 100)
  158.     p = norm.pdf(x, mu, std)
  159.     plt.plot(x, p, 'k', linewidth=2)
  160.     title = "Fit results: mu = %.2f,  std = %.2f" % (mu, std)
  161.     plt.title(title)
  162.  
  163.     plt.show()
  164.  
  165. def plot_cdf(time):
  166.     mu, std = norm.fit(time)
  167.  
  168.     # Plot the histogram.
  169.     plt.hist(time, bins=25, normed=True, alpha=0.6, color='g')
  170.  
  171.     # Plot the CDF.
  172.     xmin, xmax = plt.xlim()
  173.     x = np.linspace(xmin, xmax, 100)
  174.     c = norm.cdf(x, mu, std)
  175.     plt.plot(x, c, 'k', linewidth=2)
  176.     title = "Fit results: mu = %.2f,  std = %.2f" % (mu, std)
  177.     plt.title(title)
  178.  
  179.     plt.show()
  180.  
  181. def get_selected_stresses(result, data):
  182.     temperature_2_selected_stress = {}
  183.     for temperature, data_temp in data.groupby(['Temperature']):
  184.         # data_filtered = data[data['Temperature']==temperature]
  185.         median_deform = data_temp['def_first'].median()
  186.         selected_stress = get_selected_stress(data_temp, median_deform)
  187.         temperature_2_selected_stress[temperature] = selected_stress
  188.     return list(set(temperature_2_selected_stress.values()))
  189.  
  190. def get_params_c_k(result, data):
  191.     c_list = []
  192.     k_list = []
  193.     selected_stresses = get_selected_stresses(result, data)
  194.     data_filtered = data[data['Stress'].isin(selected_stresses)]
  195.     for stress, group in data_filtered.groupby(['Stress']):
  196.         def_first = group['def_first'].values
  197.         teta = group['teta'].values
  198.         c, k = get_estimations_params(def_first, teta)
  199.         c_list.append(c)
  200.         k_list.append(k)
  201.     filtered_c_list = [c for c in c_list if c != 0]
  202.     filtered_k_list = [k for k in k_list if k != 0]
  203.     return np.mean(filtered_c_list), np.mean(filtered_k_list)
  204.  
  205. def get_charact_c_k_2(result, data):
  206.     stresses = []
  207.     temperatures = []
  208.     c_list = []
  209.     k_list = []
  210.     for k, group in data.groupby(['Stress', 'Temperature']):
  211.         stress = k[0]
  212.         temperature = k[1]
  213.         def_first = group['def_first'].values
  214.         teta = group['teta'].values
  215.         c, k = get_estimations_params(def_first, teta)
  216.         if c != 0 or k != 0:
  217.             stresses.append(stress)
  218.             temperatures.append(temperature)
  219.             c_list.append(c)
  220.             k_list.append(k)
  221.     return stresses, temperatures, c_list, k_list
  222.  
  223. def get_params_c_k_2(stress, temperature, result, data):
  224.     stresses, temperatures, c_list, k_list = get_charact_c_k_2(result, data)
  225.     params = [stress * stress, temperature * temperature, stress * temperature, stress, temperature]
  226.  
  227.     # estimate c
  228.     mean_coef_c, mean_intercept_c = get_params_multiple_regressions_many(stresses, temperatures, c_list)
  229.     mean_c = get_value_by_params(mean_coef_c, mean_intercept_c, params)
  230.  
  231.     # estimate k
  232.     mean_coef_k, mean_intercept_k = get_params_multiple_regressions_many(stresses, temperatures, k_list)
  233.     mean_k = get_value_by_params(mean_coef_k, mean_intercept_k, params)
  234.     return mean_c, mean_k
  235.  
  236. def estimation_function(x, c, k):
  237.     return k*np.log((1+c)*np.exp(x/k) - c)
  238.  
  239. def func(x, p1,p2):
  240.   return p1*np.cos(p2*x) + p2*np.sin(p1*x)
  241.  
  242. def get_estimations_params(def_first, teta):
  243.     try:
  244.         popt, pcov = curve_fit(estimation_function, teta, def_first)
  245.         c = popt[0]
  246.         k = popt[1]
  247.         data_checked = estimation_function(teta, c, k)
  248.         residuals = def_first - data_checked
  249.         error = np.sqrt(sum(residuals**2))
  250.         return c, k
  251.     except:
  252.         return 0, 0
  253.  
  254. def get_selected_stress(data_filtered, median_deform):
  255.     stress_2_distance = {}
  256.     for stress, data_stress in data_filtered.groupby(['Stress']):
  257.         # deform_first = data_filtered[data_filtered['Stress'] == stress]
  258.         median = data_stress['def_first'].median()
  259.         stress_2_distance[stress] = math.fabs(median_deform - median)
  260.     stress_res = sorted(stress_2_distance.items(), key=operator.itemgetter(1))
  261.     return stress_res[0][0]
  262.  
  263. def calculate_time_to_failure(data, result, stress, temperature):
  264.     stresses, temperatures, means, stds = get_characteristics(data)
  265.     # mean_coef, mean_intercept = get_params_multiple_regressions(stresses, temperatures, means)
  266.     # std_coef, std_intercept = get_params_multiple_regressions(stresses, temperatures, stds)
  267.     # params = [stress, temperature]
  268.     mean_coef, mean_intercept = get_params_multiple_regressions_many(stresses, temperatures, means)
  269.     std_coef, std_intercept = get_params_multiple_regressions_many(stresses, temperatures, stds)
  270.     params = [stress * stress, temperature * temperature, stress * temperature, stress, temperature]
  271.     mean_b = get_value_by_params(mean_coef, mean_intercept, params)
  272.     std_b = get_value_by_params(std_coef, std_intercept, params)
  273.     time = calculate_time(mean_b, std_b, result, stress, temperature)
  274.     return time
  275.  
  276. def mean_calculation(stress, temperature):
  277.     result, data = process_calc()
  278.     time = calculate_time_to_failure(data, result, stress, temperature)
  279.     # plot_graphs(time)
  280.     # print('mean_Time = ', np.mean(time), 'std_Time = ', np.std(time))
  281.     # c, k = get_params_c_k(result, data)
  282.     c, k = get_params_c_k_2(stress, temperature, result, data)
  283.     result['c'] = c
  284.     result['k'] = k
  285.     print('res')
  286.  
  287.  
  288. if __name__ == '__main__':
  289.     # stress = 45
  290.     # temperature = 573
  291.     stresses_test = [70, 45, 300, 200]
  292.     temperatures_test = [523, 573, 423, 473]
  293.     for i in range(len(stresses_test)):
  294.         mean_calculation(stresses_test[i], temperatures_test[i])
  295.  
  296. # mean_Time =  202.977268144 std_Time =  35.3658215247
  297. # mean_Time =  229.291468263 std_Time =  23.530169309
  298. # mean_Time =  36.3147799399 std_Time =  21.4642344076
  299. # mean_Time =  362.608885147 std_Time =  48.3941602839
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement