به محفل ریاضی ایرانیان خوش آمدید! لطفا برای استفاده از تمامی امکانات عضو شوید
سایت پرسش و پاسخ ریاضی
+2 امتیاز
322 بازدید
در دانشگاه توسط
برچسب گذاری دوباره توسط AmirHosein

در نرم‌افزار Matlab برنامه‌ای بنویسیدکه پاسخ تقریبی معادلهٔ زیر را با روش انتگرال‌گیری عددی ذوزنقه‌ای و تقسیم‌بندی با $n=10$ زیربازه بدست‌آورد. $$U(x)= \lambda \int_0^1k(x,t)u(t){\rm d}t$$
که در آن $k(x,t)$ (هستهٔ انتگرال) به شکل زیر تعریف شده‌است. $$k(x,t)=\begin{cases} t(1-x)(2x-t^2-x^2) & ;\;0\leq t\leq x\\ x(1-t)(2t-x^2- t^2) & ;\;x\leq t\leq 1 \end{cases}$$

1 پاسخ

می توانید به پاسخ(ها) امتیاز دهید یا آن را انتخاب کنید.

0 امتیاز
توسط AmirHosein (18,141 امتیاز)

این کار را می‌توانید به روش‌های زیادی انجام دهید. چون اشاره نکردید که مقدارِ $U(x)$ در نقطهٔ $x=x_0$ -ِ خاصی می‌خواهید پس فرض می‌کنم که خودِ تابعِ $U(x)$ را از Matlab می‌خواهید. در این صورت دو راه دارید، یکی اینکه یک الگوریتم به عنوان خروجی بگیرید که از کاربر مقدار برای $x$ بگیرد و سپس مقدار برای $U(x)$ بدهد یا اینکه همانند من محاسبهٔ نمادین symbolic computation انجام دهید. چون تابعِ $u(t)$ و عددِ $\lambda$ را نداده‌اید پس فرض می‌کنم که قرار است این دو به عنوان ورودی در نظر گرفته شوند که کاربر باید بدهد و سپس function ای که در Matlab تعریف می‌کنیم $U(x)$ را به عنوان خروجی بدهد. پس دو متغیر نمادین داریم $x$ و $t$. به Matlab باید بگوئیم که این دو را به عنوان متغیر نمادین تعریف کند که با دستور syms x t انجام می‌شود. سپس باید $k(x,t)$ را برای Matlab تعریف کنیم. این هم چندین راه دارد ولی اکنون که پای محاسبهٔ نمادین به برنامه‌مان باز شده‌است پس بیاییم به صورت نمادین تعریفش کنیم. برای تعریف کردن تابع چندضابطه‌ای در Matlab به این پست نگاه بیندازید. چون به جز انتگرال فقط یک ضرب اسکالر در بیرون داریم پس می‌توان ابتدا انتگرال را بدست آورد و سپس حاصل را در عدد ثابتِ داده‌شده ضرب کرد. توجه کنید که نمی‌توانید $lambda$ و $u(t)$ را بدون اینکه از کاربر بگیرید یا از پیش تعریف کنید داخل برنامه‌تان بیاورید چون برای Matlab ناشناخته خواهند بود و به پیام خطا برخواهید خورد. برای انتگرال‌گیری به روش ذوزنقه‌ای بازهٔ $t\in [0,1]$ را به $10$ قسمتی که گفته‌اید تقسیم کنید سپس هر بار یک زیربازه را انتخاب و اگر آن را $[a,b]$ نمایش دهید، عبارتِ $$(b-a)\frac{f(a)+f(b)}{2}$$ را اضافه کنید (در شروع حاصل جمع را صفر بگذارید و با گامل اول جمع کنید سپس به نتیجه، گام دوم را بیفزائید و تا گام دهم پیش بروید). که $f(t)$ در اینجا برابر است با $k(x,t)u(t)$. سایر قضیه تنها syntax (دستورزبان نوشتاری - طرز نوشتن برنامه) در Matlab است و با فرض اینکه با نرم‌افزار Matlab و برنامه‌نویسی با آن آشنا باشید باید بدانید که چه چیزی در حال روی دادن است. اگر با Matlab و برنامه‌نویسی با آن آشنا نیستید پس ابتدا باید بروید در این مورد بیاموزید، کتاب یا ویدئوی آموزشی استفاده کنید و سپس به چنین ورسش‌هایی بیایید. برای نمونه من کد را برای ورودی‌های $\lambda=2$ و $u(t)=\sin(t)$ در زیر گذاشته‌ام. به یاد داشته باشید که اگر تابعی را در همان فایلی که ورودی‌هایتان را گذاشته‌اید تعریف می‌کنید باید تابع را در انتهای فایل قرار دهید.

function U=Ufunction(u,lambda)
syms x t
k(x,t)=piecewise(t<=x,t*(1-x)*(2*x-t^2-x^2),x<=t,x*(1-t)*(2*t-x^2-t^2));
Uexpr=0;
b=0;
for i=1:10
    a=b;
    b=a+1/10;
    Uexpr=Uexpr+(b-a)*(k(x,a)*u(a)+k(x,b)*u(b))/2;
end
U=lambda*Uexpr;
end

استفاده از این تابع (الگوریتم)

syms x t
u(t)=sin(t);
lambda=2;
Utemp=Ufunction(u,lambda);
U(x)=Utemp

خروجی بسیار دراز (طویل) می‌شود، پس به جای کل آن تصویر قسمتی از آن که مرتب نوشته‌شده‌است را می‌گذارم (سطرها به بیرون چهارچوبِ تصویر ادامه دارند). همانطور که می‌بینید یک تابع ۲۰ ضابطه‌ای گرفته‌اید که شرط‌های هر ضابطه به شکل x == 9/10 یا x in Dom::Interval([4/5], [9/10]) است، شکلِ یکُم یعنی بک نقطه، $x=\frac{9}{10}$ و شکل دوم یعنی یک بازه، $x\in (\frac{8}{10},\frac{9}{19})$ توجه کنید که $\frac{8}{10}=\frac{4}{5}$. و خودتان باید حواستان باشد که بازهٔ ابتدایی (پائین‌ترین) از پائین باید به صفر و بالاترین بازه از بالا باید به یک محدود باشند.


حمایت مالی

کانال تلگرام محفل ریاضی
امروز : تاریخ شمسی اینجا نمایش داده می‌شود
...