به پاسخی که برای پرسش کاملا یکسان دیگرتان (تنها ضابطهٔ هستهٔ تبدیل انتگرالیتان فرق میکرد و به جای جمع با یک تابع، در یک اسکالر حاصل را ضرب میکردید) یعنی این پست نگاه بیندازید. روش دقیقا یکسان است پس توضیحی در مورد چگونگی حلکردن این پرسش در اینجا نمیآورم. چون در آنجا دستور را در محیط نرمافزار Matlab آوردهام، در اینجا دستور را در محیط نرمافزار Maple میآورم که دستکم مطلب جدیدتری برای یاد گرفتن داشته باشد. میتوانید تفاوتهای پیادهسازی الگوریتم در این دو نرمافزار را ببینید. پیش از شروع، باید گوشزد کنم که خوب نیست که یک چیز تکراری را بخواهید دیگران برایتان انجام بدهند. زمانی که نیت یادگیری باشد، شما یک پرسش میپرسید و سپس تلاش میکنید که پاسخ را یاد بگیرید و روش و ایدهای که آموختید را روی سوال مشابه امتحان کنید. برای همین دلیل قانعکنندهای از اینکه پاسخ را برای دقیقا یک سوال ولی دو عدد $n=15$ و $n=20$ خواستهاید دیده نمیشود. نه تنها نکتهٔ خاصی ندارد بلکه فقط یک جایگذاری عدد در دقیقا یک پاسخ است!
ابتدا تبدیل انتگرالی اینجا را با تبدیل انتگرالی پست پیشینتان مقایسه میکینم. در پست پیشینتان هستهٔ تبدیل یک تابع دوضابطهای بود، در این پست دارید $k(x,t)=xe^t$. در پست پیشین حاصل انتگرال را در عدد $\lambda$ ضرب میکردید، در اینجا حاصل را از تابع $e^{-x}$ میکاهید.
اکنون تفاوتهای برنامهنویسی. در حالب پیشین داشتید $n=10$ در اینجا برایتان $n=15$ را انجام میدهم. به راحتی به جای $15$ میتوانید عدد $20$ قرار دهید، یا اینکه از ابتدا این عدد را نیز یک ورودی برای پروسه (در Maple به جای تابع function از اصطلاح پروسه procedure استفاده میکنیم) تعریف کنید که کاربر در هنگام فراخوانیِ پروسه آن را بدهد. در Matlab به خاطر ماهیتِ پیشفرضِ عددیِ نرمافزار، زمانی که چیزی نمادین دارید باید آن را به صورت مشخص به نرمافزار بیان کنید پس چیزی به نام دستور syms
نیاز داشتید، در حالیکه در نرمافزار Maple برعکس، طراحی پیشفرض از ابتدا تأکید بر محاسبات نمادین داشتهاست پس چنین چیزی نیاز نیست و محاسبههای نمادین راحتتر نوشته و انجام میشوند. توجه کنید که میتوانید $u$ را تابعوارانه تعریف کنید u(t)
ولی در اینجا آن را عبارتگونه تعریف میکنیم و هرگاه قرار است مقداری به جای t
بگذاریم از دستور subs
که ابتدای واژهٔ substitution به معنای «جایگذاری» استفاده میکنیم. اکنون دستور برنامه:
Ufunction:=proc(u)
local Uexpr,a,b,i;
Uexpr:=0;
b=0;
for i to 15 do
a:=b;
b:=a+1/15;
Uexpr:=Uexpr+(b-a)*(x*exp(a)*subs([t=a],u)+x*exp(b)*subs([t=b],u))/2;
end do;
return(exp(-x)+Uexpr);
end proc;
توجه کنید که در Maple میزان تو رفتگی ابتدای خطها تغییری در کد ایجاد نمیکند زیر proc
، for
و if
و از این قبیل، خطها نیازی به تورفتگی ندارند ولی آزاد هستید که در صورت تمایل انجام دهید، من این کار را اینجا انجام ندادم.
اکنون فراخوانی پروسه برای $u(t)=\sin(t)$ به عنوان نمونه:
Ufunction(sin(t));
پاسخ را با استفاده از دستورِ latex
که در این پستِ بلاگ معرفی کردیم به دستور TeX درآورده و در زیر قرار دادیم.
$${{\rm e}^{-x}}+1/15\,x{{\rm e}^{1/15}}\sin \left( 1/15 \right) +1/15\,
x{{\rm e}^{2/15}}\sin \left( 2/15 \right) +1/15\,x{{\rm e}^{1/5}}\sin
\left( 1/5 \right) +1/15\,x{{\rm e}^{{\frac{4}{15}}}}\sin \left( {
\frac{4}{15}} \right) +1/15\,x{{\rm e}^{1/3}}\sin \left( 1/3 \right) +
1/15\,x{{\rm e}^{2/5}}\sin \left( 2/5 \right) +1/15\,x{{\rm e}^{{\frac
{7}{15}}}}\sin \left( {\frac{7}{15}} \right) +1/15\,x{{\rm e}^{{\frac{
8}{15}}}}\sin \left( {\frac{8}{15}} \right) +1/15\,x{{\rm e}^{3/5}}
\sin \left( 3/5 \right) +1/15\,x{{\rm e}^{2/3}}\sin \left( 2/3
\right) +1/15\,x{{\rm e}^{{\frac{11}{15}}}}\sin \left( {\frac{11}{15}
} \right) +1/15\,x{{\rm e}^{4/5}}\sin \left( 4/5 \right) +1/15\,x{
{\rm e}^{{\frac{13}{15}}}}\sin \left( {\frac{13}{15}} \right) +1/15\,x
{{\rm e}^{{\frac{14}{15}}}}\sin \left( {\frac{14}{15}} \right) +1/30\,
x{\rm e}\sin \left( 1 \right)
$$
همانطور که میبینید ۱۵ جمعوند دارد. اگر بخواهید سینوسها و توانهای عدد نپر را تقریب بزنید و سپس این جمع را ساده کنید میتوانید از دستور زیر استفاده کنید.
evalf((2));
که پرانتز شمارهٔ ۲ با فشردن کلید ترکیبیِ ctrl+L
و سپس قرار دادن شمارهٔ خروجی مورد نظر که در برنامهٔ من ۲ بودهاست در داخل پرانتزهای دستور evalf
قرار گرفته است. به جای استفاده از شمارهٔ خروجی میتوانید از علامت درصد در صورتیکه این خط را بلافاصله پس از اجرای چیزی که میخواهید روی آن اثر کنید استفاده کنید. یا بهترین راه این است که خروجیای که میخواهید این دستور رویش اثر کند را از ابتدا نامگذاری میکردید و سپس نام آن خروجی را در داخل پرانتزِ evalf
بگذارید. به هر حال حاصل برابر میشود با
$$U(x)\simeq e^{-x}+(0.9103515323)x$$
در واقع از همان ابتدا میتوانستید $x$ را از انتگرال بیرون بیاورید و حاصل انتگرال به روشنی یک عدد است.