به محفل ریاضی ایرانیان خوش آمدید! لطفا برای استفاده از تمامی امکانات عضو شوید
سایت پرسش و پاسخ ریاضی

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

عضویت

هر سوال ریاضی که دارید می توانید بپرسید

سوال بپرسید

می توانید به سوالات پاسخ دهید

سوالات

امتیاز بگیرید و به دیگران امتیاز دهید

بدون پاسخ

Visanil
+2 امتیاز
909 بازدید
در دانشگاه توسط
برچسب گذاری دوباره توسط 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 (19,677 امتیاز)

این کار را می‌توانید به روش‌های زیادی انجام دهید. چون اشاره نکردید که مقدارِ 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}. و خودتان باید حواستان باشد که بازهٔ ابتدایی (پائین‌ترین) از پائین باید به صفر و بالاترین بازه از بالا باید به یک محدود باشند.

...