# مباحث متفرقه برنامه نویسی > برنامه نویسی Matlab >  رسم تابع sin x توسط بسط تیلور

## Hadi-Hashemi

با سلام خدمت دوستان

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

فکر کنم باید از بسط تیلور استفاده کنم ولی نمیشه. اگه دوستان کمک کنن خوشحال میشم.

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

e72a9c97103eed0fe72a1975a8fd748a.png
این هم کدی که من نوشتم:


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);


اینهم خروجی که من گرفتم:
rgM3pm.png
دوستان همونطور که میبینین اصلا شبیه sinx نیست.

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

----------


## rahnema1

سلام
اینجور میشه نوشت

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

دوست عزیز با تشکر از جوابتون

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

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

----------


## ehsan_faal

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

----------


## Hadi-Hashemi

اینم نشد  :ناراحت: 
4LlynQ.png

----------


## ehsan_faal

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

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)

Fig1.png

----------


## ehsan_faal

شکل درسته فقط تعداد جملات بسط کمه

----------


## rahnema1

چون هر چه عدد بزرگتر بشه فکتوریل اون دقت کمتری داره لازمه ابتدا 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

با تشکر از همه دوستان, بالاخره شد.  :لبخند: 

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


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');

4LlEq4.png

----------

