سایت شخصی صادق سلمانی

ولتست، بهینه‌سازی تولید و عملکرد چاه، یادگیری ماشین، پایتون، چاه‌های هوشمند، تحلیل داده، فرازآوری مصنوعی

سایت شخصی صادق سلمانی

ولتست، بهینه‌سازی تولید و عملکرد چاه، یادگیری ماشین، پایتون، چاه‌های هوشمند، تحلیل داده، فرازآوری مصنوعی

سایت شخصی صادق سلمانی

مطالبی که در این سایت نوشته می‌شود به منزله تخصص من در آن‌ها نمی‌باشد، بلکه صرفاً آغازی است در مسیری طولانی برای یادگیری بهتر و عمیق‌تر.

آخرین نظرات

۱۷ مطلب با موضوع «کدنویسی» ثبت شده است

تابع خطا (Error Function) در ریاضیات، تابعی غیراصلی (نداشتن ضابطه صریح) است که در علوم احتمالات، مواد، آمار و معادلات دیفرانسیل با مشتقات جزئی استفاده می‌شود. تعریف این تابع به صورت زیر است (منبع: ویکی پدیا):


همچنین متمم تابع خطا (Complementary Error Function) نیز به شکل زیر تعریف می‌شود:


نمودار تابع خطا


جدول تابع خطا


علاوه بر اینها، در زبان برنامه‌نویسی پایتون نیز دستوری وجود دارد که می‌توان تابع خطای هر مقداری را محسابه نمود:


from math import *


erf (2)

>> 0.9953222650189527


erfc (2)
>> 0.004677734981047268

یکی از کاربردهای تابع خطا در درس چاه‌آزمایی می‌باشد. مثلاً گرینگارتن و همکاران با استفاده از توابع گرین (Green’s function)، معادله انتشار را برای یک چاه شکافدار (مدل شار یکنواخت) حل نمودند و به رابطه زیر رسیدند:

همان‌طور که مشاهده می‌کنید برای محاسبه فشار بی‌بعد در این رابطه، باید مقادیر تابع خطا را داشته باشیم. 

۰ نظر ۰۸ شهریور ۹۶ ، ۱۷:۲۸
صادق سلمانی

یکی از موضوعات مهم ریاضیات و آمار که کاربرد زیادی در رشته‌های مهندسی دارد، مبحث برازش منحنی (Curve Fitting) می‌باشد. 

هدف ما در برازش منحنی آن است که بهترین خط یا منحنی ممکن را از داده‌های موجود عبور دهیم. برای آنکه متوجه شویم که بهترین چندجمله‌ای یا منحنی ممکن را انتخاب کرده‌ایم، باید مجموع مربعات باقمانده‌ها حداقل باشد:


.The most common choice is to minimize the sum of squared residuals


معرفی چند تابع:

1- z = polyfit (x, y, n) 

این تابع، مقادیر x داده و مقادیر y داده‌ها را دریافت می‌کند و سپس یک منحنی درجه n ام از داده‌ها عبور می‌دهد به نحوی که بهترین انطباق ممکن را داشته باشد (حداقل مربعات). 

2- p = poly1d (z)

یک تابع چند جمله‌ای از ضرایب می‌سازد.



بررسی یک مثال از مبحث برازش منحنی:

from numpy import *

x = array ([0.0 , 1.0 , 2.0 , 3.0 , 4.0 , 5.0])

y = array ([0.0 , 0.8 , 0.9 , 0.1 , -0.8 , -1.0])

z = polyfit (x, y, 3)

p = poly1d (z)

xs = [ 0.1 * i for i in range (50)]

ys = [p ( x ) for x in xs]


from pylab import *

plot (x, y, 'o', label='data')

plot (xs, ys, label='fitted curve')

ylabel ('y')

xlabel ('x')

show ()


۰ نظر ۰۴ شهریور ۹۶ ، ۰۸:۳۶
صادق سلمانی

الآن در حال حل یکی از مثال‌های کتاب چاه‌آزمایی جان لی بودم که در میان مسیر باید مقدار Exponential Integral را محاسبه می‌کردم. روش معمول آن است که به جداول خود کتاب مراجعه کنیم و با کمی جستجو مقدار آن را بدست آوریم. ولی راه حل بهتر آن است که این کار را با استفاده از اکسل، پایتون، متلب و غیره انجام دهیم تا هم سریع‌تر باشد و هم مقدار دقیق‌تری بدست آید. 

ماژول Scipy یک تابع مناسبی برای محاسبه مقادیر Ei ارائه می‌دهد:

from scipy import*
x=expi(-0.5)
print(x)

نتیجه:
x = - 0.559773594776

۰ نظر ۰۷ ارديبهشت ۹۶ ، ۱۱:۰۵
صادق سلمانی

در مسائل مقدار اولیه، مقدار تابع در نقطه شروع داده می‌شود و با استفاده از روش‌های موجود مقدار آن را در سایر نقاط بدست می‌آوریم. در این صورت منحنی تغییرات متغیر تابع بر حسب متغیر مستقل قابل رسم خواهد بود.

از جمله روش‌های حل مسائل مقدار اولیه می‌توان به روش‌های تیلور، اویلر و رانگ کاتا مرتبه دوم، سوم و چهارم اشاره نمود. در کلیه این روش‌ها مختصات هر نقطه با استفاده از مختصات نقطه ماقبلش بدست می‌آید. اساس کلیه این روش‌ها، استفاده از سری تیلور است.

تذکر: برای مطالعه توضیحات بیشتر به کتاب «کاربرد ریاضیات در مهندسی شیمی - روش‌های عددی» نوشته دکتر خراط مراجعه کنید.

خلاصه روش رانگ کاتا مرتبه سوم:


در اینجا قصد دارم به بررسی یک مثال به روش رانگ کاتا - 3 بپردازم. قبلاً این مثال را به روش‌های اویلر، رانگ کاتا-2 و رانگ کاتا-4 نیز حل کرده‌ام (+ و + و +)


مثال:

معادله دیفرانسیل زیر را با استفاده از روش رانگ کاتا مرتبه سوم و برای حالت h = 0.5 حل کنید و مقدار تابع را تا x = 3.5 محاسبه کنید.


حل با استفاده از زبان برنامه نویسی پایتون (کدنویسی در محیط Spyder):
import numpy as np
from matplotlib import pyplot as plt
x0=1
y0=1
xf=3.5
n=6
h=(xf-x0)/(n-1)
x=np.linspace(x0,xf,n)
y=np.zeros([n])
y[0]=y0
for in range(1,n):
    k1=h*x[i-1]*y[i-1]**(1/3)
    k2=h*(x[i-1]+0.5*h)*(y[i-1]+0.5*k1)**(1/3)
    k3=h*(x[i-1]+h)*(y[i-1]+2*k2-k1)**(1/3)
    y[i]=y[i-1]+(1/6)*(k1+4*k2+k3)
for in range(n):
    print(x[i],y[i])
plt.plot(x,y,'o')
plt.xlabel('value of x')
plt.ylabel('value of y')
plt.title('Approximate Solution with RK-3 Method')
plt.show()
نتایج:

1.0                          1.0
1.5           1.6855277908
2.0            2.826623146
2.5           4.5570242827
3.0           7.0160178606
3.5           10.345325211


۰ نظر ۰۳ ارديبهشت ۹۶ ، ۱۵:۲۶
صادق سلمانی

در مسائل مقدار اولیه، مقدار تابع در نقطه شروع داده می‌شود و با استفاده از روش‌های موجود مقدار آن را در سایر نقاط بدست می‌آوریم. در این صورت منحنی تغییرات متغیر تابع بر حسب متغیر مستقل قابل رسم خواهد بود.

از جمله روش‌های حل مسائل مقدار اولیه می‌توان به روش‌های تیلور، اویلر و رانگ کاتا مرتبه دوم، سوم و چهارم اشاره نمود. در کلیه این روش‌ها مختصات هر نقطه با استفاده از مختصات نقطه ماقبلش بدست می‌آید. اساس کلیه این روش‌ها، استفاده از سری تیلور است.

تذکر: برای مطالعه توضیحات بیشتر به کتاب «کاربرد ریاضیات در مهندسی شیمی - روش‌های عددی» نوشته دکتر خراط مراجعه کنید.

خلاصه روش رانگ کاتا مرتبه چهارم:


در اینجا قصد دارم به بررسی یک مثال به روش رانگ کاتا - 4 بپردازم. قبلاً این مثال را به روش‌های اویلر و رانگ کاتا-2 نیز حل کرده‌ام (+ و +)

مثال:

معادله دیفرانسیل زیر را با استفاده از روش رانگ کاتا مرتبه چهارم و برای حالت h = 0.5 حل کنید و مقدار تابع را تا x = 3.5 محاسبه کنید.


حل با استفاده از زبان برنامه نویسی پایتون (کدنویسی در محیط Spyder):
import numpy as np
from matplotlib import pyplot as plt
x0=1
y0=1
xf=3.5
n=6
h=(xf-x0)/(n-1)
x=np.linspace(x0,xf,n)
y=np.zeros([n])
y[0]=y0
for i in range(1,n):
    k1=h*x[i-1]*y[i-1]**(1/3)
    k2=h*(x[i-1]+0.5*h)*(y[i-1]+0.5*k1)**(1/3)
    k3=h*(x[i-1]+0.5*h)*(y[i-1]+0.5*k2)**(1/3)
    k4=h*(x[i-1]+h)*(y[i-1]+k3)**(1/3)
    y[i]=y[i-1]+(1/6)*(k1+2*k2+2*k3+k4)
for i in range(n):
    print(x[i],y[i])
plt.plot(x,y,'o')
plt.xlabel('value of x')
plt.ylabel('value of y')
plt.title('Approximate Solution with RK-4 Method')
plt.show()
نتایج:

1.0      1.0
1.5       1.6860902679
2.0     2.82824535285
2.5     4.56006327111
3.0     7.02071665246
3.5     10.3518481736


۰ نظر ۰۱ ارديبهشت ۹۶ ، ۰۱:۲۲
صادق سلمانی

در مسائل مقدار اولیه، مقدار تابع در نقطه شروع داده می شود و با استفاده از روش های موجود مقدار آن را در سایر نقاط بدست می آوریم. در اینصورت منحنی تغییرات متغیر تابع بر حسب متغیر مستقل قابل رسم خواهد بود.

از جمله روش های حل مسائل مقدار اولیه می توان به روش های تیلور، اویلر و رانگ کاتا مرتبه دوم، سوم و چهارم اشاره نمود. در کلیه این روش ها مختصات هر نقطه با استفاده از مختصات نقطه ماقبلش بدست می آید. اساس کلیه این روش ها، استفاده از سری تیلور است.

تذکر: برای مطالعه توضیحات در مورد روش رانگ کاتا-2 به کتاب «کاربرد ریاضیات در مهندسی شیمی - روش های عددی» نوشته دکتر خراط مراجعه کنید.

خلاصه این روش:


در اینجا قصد دارم به بررسی یک مثال به روش رانگ کاتا - 2 بپردازم. قبلاً این مثال را به روش اویلر نیز حل کرده ام (این پست).

مثال:

معادله دیفرانسیل زیر را با استفاده از روش رانگ کاتا مرتبه دوم و برای حالت h = 0.5 حل کنید و مقدار تابع را تا x = 3.5 محاسبه کنید.


حل با استفاده از زبان برنامه نویسی پایتون (کدنویسی در محیط Spyder):
import numpy as np
from matplotlib import pyplot as plt
x0=1
y0=1
xf=3.5
n=6
h=(xf-x0)/(n-1)
x=np.linspace(x0,xf,n)
y=np.zeros([n])
y[0]=y0
for i in range(1,n):
    k1=h*x[i-1]*y[i-1]**(1/3)
    k2=h*(x[i-1]+h)*(y[i-1]+k1)**(1/3)
    y[i]=y[i-1]+0.5*(k1+k2)
for i in range(n):
    print(x[i],y[i])
plt.plot(x,y,'o')
plt.xlabel('value of x')
plt.ylabel('value of y')
plt.title('Approximate Solution with RK-2 Method')
plt.show()
نتایج:

1.0    1.0
1.5    1.67926784096
2.0    2.80994158899
2.5    4.52558068947
3.0    6.96573342035
3.5    10.2725017487

۰ نظر ۲۲ اسفند ۹۵ ، ۲۳:۴۰
صادق سلمانی

در مسائل مقدار اولیه، مقدار تابع در نقطه شروع داده می شود و با استفاده از روش های موجود مقدار آن را در سایر نقاط بدست می آوریم. در اینصورت منحنی تغییرات متغیر تابع بر حسب متغیر مستقل قابل رسم خواهد بود.

از جمله روش های حل مسائل مقدار اولیه می توان به روش های تیلور، اویلر و رانگ کاتا مرتبه دوم، سوم و چهارم اشاره نمود. در کلیه این روش ها مختصات هر نقطه با استفاده از مختصات نقطه ماقبلش بدست می آید. اساس کلیه این روش ها، استفاده از سری تیلور است.

تذکر: برای مطالعه توضیحات بیشتر به کتاب «کاربرد ریاضیات در مهندسی شیمی - روش های عددی» نوشته دکتر خراط مراجعه کنید.

روش اویلر:


در اینجا قصد دارم به بررسی یک مثال به روش اویلر بپردازم.

مثال:

معادله دیفرانسیل زیر را با استفاده از روش اویلر و برای حالت h = 0.5 حل کنید و مقدار تابع را تا x = 3.5 محاسبه کنید.

حل با استفاده از زبان برنامه نویسی پایتون (کدنویسی در محیط Spyder):

import numpy as np

from matplotlib import pyplot as plt

x0=1

y0=1

xf=3.5

n=6

h=(xf-x0)/(n-1)

x=np.linspace(x0,xf,n)

y=np.zeros([n])

y[0]=y0

for i in range(1,n):

    y[i]=y[i-1]+h*x[i-1]*y[i-1]**(1/3)

for i in range(n):

    print(x[i],y[i])

plt.plot(x,y,'o')

plt.xlabel('value of x')

plt.ylabel('value of y')

plt.title('Approximate Solution with Euler Method')

plt.show()


نتایج:

1.0   1.0

1.5   1.5

2.0   2.35853568191

2.5   3.6896463079

3.0   5.62119172863

3.5   8.28825954375


۰ نظر ۱۹ اسفند ۹۵ ، ۱۲:۳۱
صادق سلمانی

در چند پست آتی قصد دارم که انتگرال‌گیری عددی به روش‌های مختلف را بررسی کنم. برای مطالعه توضیحات مربوط به این روش ها به کتاب کاربرد ریاضیات در مهندسی شیمی (دکتر خراط) مراجعه کنید. در این مطلب به کدنویسی انتگرال‌گیری عددی به روش ذوزنقه‌ای می پردازیم.


مثال:

# the function to be integrated

def func(x):

    return x**2

# define variables

a = 1.          # left boundary of area

b = 4.          # right boundary of area

dx = 1          # width of the trapezoids

# calculate the number of trapezoids

n = int((b - a) / dx)

# define the variable for area

Area = 0

# loop to calculate the area of each trapezoid and sum.

for i in range(1, n+1):

    #the x locations of the left and right side of each trapezpoid

    x0 = a+(i-1)*dx

    x1 = a+i*dx

    #the area of each trapezoid

    Ai = dx * (func(x0) + func(x1))/ 2.

    # cumulatively sum the areas

    Area = Area + Ai

#print out the result.

print ("Area = ", Area)

نتیجه:

Area = 21.5


یک نمونه کد دیگر برای انتگرال گیری عددی به روش ذوزنقه ای:

import numpy as np

x = np.linspace(1, 4, num=4)

y = x**2

I = np.trapz(y, x)

error = (I - 4)/4

print(I, error)

نتیجه:

I = 21.5

error = 4.375

۰ نظر ۰۸ اسفند ۹۵ ، ۱۱:۵۹
صادق سلمانی

برای مطالعه مبحث «چندجمله‌ای‌های حداقل مربعات» به کتاب «کاربرد ریاضیات در مهندسی شیمی - روش های عددی» که دکتر خراط نوشته اند مراجعه کنید. البته منابع مختلف دیگری هم در اینترنت موجود هست که به طور کامل توضیح داده اند. در کتاب دکتر خراط تمام روش های عددی و ریاضیاتی به طور مفصل و به همراه مثال توضیح داده شده اند که واقعا عالی هست.


مثال: از پنج نقطه داده شده در زیر یک سهمی از روش حداقل مجموع مربعات خطا بدست آورید:

(-2,4) , (-1,3) , (2,4) , (3,1) , (4,2)


import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit  # Use non-linear least squares to fit a function, f, to data.

xdata=np.array([-2,-1,2,3,4])  # fit this data with a function

ydata=np.array([4,3,4,1,2])


def func(x,p1,p2,p3):

    return p1*x**2+p2*x+p3   # I’d like to fit this function using nonlinear least squares.


popt,pcov=curve_fit(func,xdata,ydata,p0=(3,1,2))

print('parrameters=',popt)   # The variable popt contains the fit parameters


p1=popt[0]

p2=popt[1]

p3=popt[2]

residuals = func(xdata,p1,p2,p3)-ydata 

print('residuals=',residuals)


fres = sum(residuals**2)

print('fres=',fres)



xfit = np.linspace(-3,6)

yfit = func(xfit, popt[0], popt[1], popt[2])

plt.plot(xdata,ydata,'r.')

plt.plot(xfit,yfit,'b-') 

plt.show()

خروجی:

parrameters= [-0.06280788 -0.21305419  3.48275862]

residuals= [-0.34236453  0.63300493 -1.19458128  1.27832512 -0.37438424]

fres= 3.71921182266


منابع تکمیلی:

http://www.walkingrandomly.com/?p=5215

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

۰ نظر ۰۶ اسفند ۹۵ ، ۱۳:۴۷
صادق سلمانی


چندین سال بود که هرچه اراده می کردم تا یک زبان برنامه نویسی را یاد بگیرم، هر بار نیمه تمام رها میشد. یک مدت متلب کار کردم و چندین آموزش ویدئویی از سایت فرادرس تهیه کردم و حتی حدود شصت صفحه جزوه هم نوشتم ولی در نهایت به انجام پروژه ختم نشد و آن را کنار گذاشتم. در یک بازه زمانی، به دلیل شغل پسرخاله ام که برنامه نویسی با سی شارپ است، این زبان را نیز شروع کردم ولی باز رها شد. آن موقع با هر بار رها شدن یادگیری برنامه نویسی، بسیار خودم را سرزنش می کردم و تصور می کردم که استعداد این کار را ندارم. 

چند ماه پیش بود که دوباره تصمیم گرفتم برنامه نویسی را شروع کنم. ولی این بار واقعاً نیاز داشتم که یاد بگیریم. در یک پروژه ای که کاملاً به صورت اختیاری آن را استارت زده بودم، مجبور شدم که یک الگوریتم ریاضیاتی را کدنویسی کنم. در ابتدا از چند تا از دوستانم خواستم که آن را در متلب برای من کدنویسی کنند و در اختیارم قرار دهند. ولی هر بار از انجام آن طفره رفتند و در نهایت خودم ماندم و خودم.

این شد که تصمیم گرفتم شروع کنم، ولی با راه حلی متفاوت. در سایت دانشگاه های مختلف و برتر دنیا جستجو کردم تا ببینم آن ها چه زبانی را تدریس می کنند. بعد از دو سه روز زبان مورد نظرم را یافتم. حال به مرحله یادگیری آن زبان رسیده بودم. به طور اتفاقی متوجه شدم که سایت فرادرس آموزش ویدئویی آن زبان برنامه نویسی را دارد. بنابراین، سریعاً آن را خریدم و در حدود سی ساعت فیلم آموزشی دیدم و جزوه نوشتم. فکر می کنم الآن جزوه ام حدود هشتاد صفحه هست. از آنجایی که تا به حال اسم این زبان را نشنیده بودم و همچنین کسی نیز به من معرفی نکرده بود، اشتیاق زیادی برای یادگیری آن داشتم و لذت می بردم. پس از چندین روز، کل آموزش ها را مشاهده کردم و کلیات آن را یاد گرفتم. یک شب بعد از دفاع از پایان نامه ارشدم، در حالیکه تنها در اتاق بودم و همه دوستان به خانه رفته بودند، تصمیم گرفتم که آن الگوریتم را کدنویسی کنم. خلاصه حدود 5 ساعت وقت گذاشتم و در نهایت موفق به کدنویسی آن شدم. چنان لذتی داشت که نگو. به قول معروف نیازی به منت کشی کسی نیز نبود. 

قصدم از این مطلب این هست که بگویم بهترین راه حل برای یادگیری آن است که در ابتدا یک مسأله برای خودمان تعریف کنیم و در حقیقت فرایند یادگیری به صورت پروژه-محور باشد. این در حالی است که اکثر ما، ابتدا چندین نرم افزار را یاد می گیریم و سپس به فکر استفاده از آن ها می افتیم. برای همین هست که همیشه همه کاره و هیچ کاره ایم. همه نرم افزارها را بلد هستیم ولی دقیقاً نمی دانیم که کجاها مورد استفاده قرار می گیرند و در پشت نرم افزارها چه خبر است. خیلی سخت است که ابتدا یک نرم افزار را یاد بگیریم و سپس به فکر ایجاد راه هایی برای استفاده از آن ها و کسب درآمد باشیم. پیشنهاد مناسب آن است که تا زمانی که به مسأله ای برنخورده اید و یا چالش و درگیری ذهنی ندارید، سراغ یادگیری هیچ نرم افزاری نروید؛ چرا که به سرعت فراموش می کنید و یادگیری شما کاربردی نخواهد بود.

بهترین ایجاد کننده انگیزه در وجود من برای یادگیری هر موضوع جدیدی، کسب درآمد از آن و تبدیل مستقیم دانش به ارزش می باشد؛ خواه در کوتاه مدت و خواه در بلند مدت.

۱ نظر ۰۵ اسفند ۹۵ ، ۰۴:۵۴
صادق سلمانی