ورود

View Full Version : رسم تابع sin x توسط بسط تیلور



Hadi-Hashemi
چهارشنبه 22 بهمن 1393, 21:35 عصر
با سلام خدمت دوستان

میخوام بدون استفاده از دستور sinx در مطلب تابع sinx رو رسم کنم.

فکر کنم باید از بسط تیلور (http://fa.wikipedia.org/wiki/%D8%A8%D8%B3%D8%B7_%D8%AA%DB%8C%D9%84%D9%88%D8%B1) استفاده کنم ولی نمیشه. اگه دوستان کمک کنن خوشحال میشم.

این هم بسط تیلور برای تابع sinx:


128382

این هم کدی که من نوشتم:



x = 1:100;

sinx = zeros(1,100);

for i = 1:100
sinx(i) = x(i) - x(i)^3/6 + x(i)^5/120 - x(i)^7/5040;
end

plot(sinx, x);


اینهم خروجی که من گرفتم:

128383

دوستان همونطور که میبینین اصلا شبیه sinx نیست.

لطفا اشتباهم رو تصحیح بفرمایین. با تشکر

rahnema1
چهارشنبه 22 بهمن 1393, 23:00 عصر
سلام
اینجور میشه نوشت

function output = sinx(x)
output = zeros(size(x));
prescision = 100;
Range = (1:2:prescision);
Zarib = 0:(numel(Range) - 1);
for i = 1: numel(x)
output(i) = sum(((-1) .^ Zarib) .* bsxfun(@rdivide, x(i).^ Range , factorial(Range)));
end
end

Hadi-Hashemi
پنج شنبه 23 بهمن 1393, 19:01 عصر
دوست عزیز با تشکر از جوابتون

فقط اگه ممکنه یه کم در مورد کد توضیح بدین.

و اینکه این کد رو چطوری باید اجرا کنم؟

ehsan_faal
پنج شنبه 23 بهمن 1393, 19:42 عصر
سلام.شما باید کد آقای رهنما رو تو یه ام فایل ذخیره کنید و بعد تو محیط Command window یه بردار برای x درست کنید و اون رو این طور فراخوانی کنید:

x=1:100;
Data=sinx(x);
plot(x,Data)
و یه نکته ی دیگه هم اینکه توی دستور plot آرگومان اولی مربوط به محور افقی میشه،چیزی که شما نوشتید صرفنظر از اینکه تعداد جملاتش خیلی کمه،توی قسمت رسم هم مشکلی که گفتم رو داره.

Hadi-Hashemi
جمعه 24 بهمن 1393, 09:31 صبح
اینم نشد :ناراحت:

128418

ehsan_faal
جمعه 24 بهمن 1393, 11:13 صبح
این کد خودتونه و جوابی که من گرفتم:


i=0:0.01:2*pi;
sinx=zeros(size(i));
c=1;
for j=i
sinx(c)=j - j^3/6 + j^5/120 - j^7/5040;
c=c+1;
end
plot(i,sinx)

128422

ehsan_faal
جمعه 24 بهمن 1393, 11:14 صبح
شکل درسته فقط تعداد جملات بسط کمه

rahnema1
جمعه 24 بهمن 1393, 13:19 عصر
چون هر چه عدد بزرگتر بشه فکتوریل اون دقت کمتری داره لازمه ابتدا x را جوری تغییر بدیم که لازم نباشه فاکتوریل عدد بزرگ گرفته بشه

function output = sinx(x)
x= mod(x, pi * 2);
output = zeros(size(x));
prescision = 100;
Range = (1:2:prescision);
Zarib = 0:(numel(Range) - 1);
for i = 1: numel(x)
output(i) = sum(((-1) .^ Zarib) .* bsxfun(@rdivide, x(i).^ Range , factorial(Range)));
end
end

Hadi-Hashemi
جمعه 24 بهمن 1393, 18:28 عصر
با تشکر از همه دوستان, بالاخره شد. :لبخندساده:

کد رو اینجا میذارم شاید بدرد بقیه هم بخوره.



i = 0 : 0.01 : 2 * pi;
taylorSin = zeros(size(i));

sayac = 1;

for x = i

taylorSin(sayac) = x - ...
(x^ 3 / factorial( 3)) + ...
(x^ 5 / factorial( 5)) - ...
(x^ 7 / factorial( 7)) + ...
(x^ 9 / factorial( 9)) - ...
(x^11 / factorial(11)) + ...
(x^13 / factorial(13));

sayac = sayac + 1;

end

subplot(2,2,1); % Taylor serisi ile çizilen Sin
plot(i, taylorSin, 'M');
xlabel('Taylor Sin','FontSize',12,'FontWeight','bold','Color','M' );


sinx = linspace(0, 7);
normalSin = sin(sinx);

subplot(2,2,2); % Sin fonksiyonu ile çizilen Sin
plot(sinx, normalSin, 'B');
xlabel('Normal Sin','FontSize',12,'FontWeight','bold','Color','B' )

subplot(2,2,3); % Fonksiyonların üst üste çizilmiş hali
plot(i, taylorSin, 'M');
hold on
plot(sinx, normalSin, 'B');
xlabel('Her 2 fonksiyon','FontSize',12,'FontWeight','bold','Colo r','R');


128432