آموزش متلب (MATLAB)
۵۴۳ آموزش
نمایش دسته بندی ها (۵۴۳ آموزش)

محاسبه ضرایب سری فوریه یک تابع متناوب در متلب

با استفاده از ضرایب سری فوریه یک تابع متناوب، می توانیم آن تابع را بر حسب مجموعه ای از توابع پایه تقریب بزنیم. فرض کنید تابع f(x) دارای دوره تناوب باشد. در این صورت این تابع را می توانیم بر حسب ضرایبی از sin و cos به دست آوریم. این ضرایب به صورت زیر محاسبه می شوند :

\[ a_n={1 \over \pi}\int_{-\pi}^{\pi} f(x)cos(nx)\,dx, ~~~~~ n \geq 0 \] \[ b_n={1 \over \pi}\int_{-\pi}^{\pi} f(x)sin(nx)\,dx, ~~~~~ n \geq 1 \]

نکته مهم این است که برای به دست آوردن ضرایب سری فوریه، تابع f(x) حتما باید در بازه دوره تناوب خود، انتگرال پذیر باشد.

تابع f(x) را نیز به وسیله این ضرایب می توانیم به صورت زیر تقریب بزنیم :

\[ (S_Nf)(x)={a_0 \over 2} + {\sum_{n=1}^N [a_ncos(nx)+b_nsin(nx)],} ~~~~~ N \geq 0 \]

حال می خواهیم با متلب برنامه ای بنویسیم که ضرایب سری فوریه تابعی دلخواه را برای ما به دست آورده و همچنین مقدار تقریب زده شده این تابع به وسیله این ضرایب سری فوریه را در یک x مشخص حساب کند. فرض می کنیم تابع به صورت f(x)=sin(x) باشد و کدهای زیر را می نویسیم :


clear all
clc
syms x
f=sin(x);
N=10;
a_0=(1/pi)*int(f*cos(0*x),-pi,pi)
for n=1:N
    a_n(n)=(1/pi)*int(f*cos(n*x),-pi,pi);
    b_n(n)=(1/pi)*int(f*sin(n*x),-pi,pi);
end
a_n
b_n
 
f_new=a_0/2;
for n=1:N
    f_new=f_new+a_n(n)*cos(n*x)+b_n(n)*sin(n*x);
end
 
subs(f_new,x,5)
subs(f,x,5)

تابع f_new که بر حسب ضرایب سری فوریه به دست می آید، تقریبی از تابع f می باشد. دستور subs(f_new,x,5) ، در تابع f_new ، مقدار x=5 را جایگذاری می کند. همچنین در خط بعدی، مقدار subs(f,x,5) را محاسبه کرده ایم تا بتوانیم مقدار تقریبی f_new(5) را با مقدار f(5) مقایسه کنیم.

نتیجه :


a_0 =
 
0
 
 
a_n =
 
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 
 
b_n =
 
[ (5734161139222659*pi)/18014398509481984, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 
 
ans =
 
   -0.9589
 
 
ans =
 
   -0.9589

مشاهده می کنید که دو مقدار، دقیقا با هم برابر شده اند.

نویسنده علیرضا گلمکانی
شماره کلید 103
گزینه ها
به اشتراک گذاری (Share) در شبکه های اجتماعی
نظرات 4 4 0
hamid
۱۳۹۸/۱۰/۲۵
۱۴:۱۲

سلام
ممنون از سایت خوبتون ولی در اجرای این کد مشکلی وجود داره. برخلاف خروجی ای که توی سایت گذاشتین، وقتی کد اجرا میشه دو خط آخر که محاسباته اجرا نمیشه و فقط مینویسه (5)sin
مشکلش چیه؟

admin
۱۳۹۸/۱۰/۲۵
۱۵:۳۵

سلام.
محاسبات صحیح است، اما نتیجه نهایی به صورت یک عدد صحیح یا عدد اعشاری نمایش داده نشده.
برای اینکه نتیجه را به صورت یک عدد صحیح یا عدد اعشاری داشته باشیم، می توانیم از دستور vpa در متلب (MATLAB) استفاده نماییم (کلید شماره 26435) (در صورت تمایل، برای تعیین تعداد رقم اعشاری، توضیحات نوشته شده در کلید مورد نظر را بخوانید).
بنابراین کدهای متلب (MATLAB) مورد نظر را به صورت زیر می نویسیم :

کد پی‌اچ‌پی:
clear all
close all
clc

syms x
f
=sin(x);
N=10;
a_0=(1/pi)*int(f*cos(0*x),-pi,pi)
for 
n=1:N
    a_n
(n)=(1/pi)*int(f*cos(n*x),-pi,pi);
 
   b_n(n)=(1/pi)*int(f*sin(n*x),-pi,pi);
end
a_n
b_n
 
f_new
=a_0/2;
for 
n=1:N
    f_new
=f_new+a_n(n)*cos(n*x)+b_n(n)*sin(n*x);
end
 
value_1 
vpa(subs(f_new,x,5))
value_2 vpa(subs(f,x,5)) 

نتیجه اجرای کد متلب (MATLAB) بالا :

کد پی‌اچ‌پی:
a_0 =
 
0
 
 
a_n 
=
 
0000000000]
 
 
b_n =
 
[ (
5734161139222659*pi)/18014398509481984000000000]
 
 
value_1 =
 
-
0.95892427466313852817614113118698
 
 
value_2 
=
 
-
0.95892427466313846889315440615599 


Flower

hamid
۱۳۹۸/۱۰/۲۶
۰۷:۳۹

خیلی ممنون از توضیحات کاملتون  Heart

zahra
۱۴۰۱/۰۷/۲۹
۲۲:۵۷

ممنون از توضییحات کامل و دقیق تون که با قلمی شیوا بیان شده است

ارسال نظر جدید (بدون نیاز به عضو بودن در وب سایت)