(۱۳۹۲/۰۲/۲۷, ۱۲:۴۵ ق.ظ)'admin' نوشته: قسمتی از کدها رو اشتباه نوشتید، من برنامه خودتون رو با مرتب کردن و تصحیح فواصل مربوط به حلقه ها در اینجا میارم (حالا میگم اشتباه در کجاست) :
کد:disp('Polynominal Equation: a1.X^(n)+ a2.X^(n-1)+ ….+an.X^(0)');
disp('Quadratic factor: x^2-rx-s');
n=input('Polynominal degree, n=');
for i=1:n+1
a(i)=input(['a',num2str(i),'=']);
end
r=input(' Please insert value of r=');
s=input(' Please insert value of s=');
tol=input('Tolerance for error=');
k=1;
z=1;
ite=0;
while n>=3;
e=1;
while e>tol;
ite=ite+1;
for i=1:n+1;
if i==1;
b(i)=a(i);
c(i)=b(i);
else if i==2;
b(i)=a(i)+r*b(i-1);
c(i)=b(i)-r*c(i-1);
else
b(i)=a(i)+r*b(i-1)+s*b(i-2);
c(i)=a(i)-r*c(i-1)-s*c(i-2);
end
end
end
denom=c(n-1)^2-c(n)*c(n-2);
if denom==0;
r=r+1;
s=s-1;
E=1;
else
delr=(-b(n)*c(n-1)+b(n+1)*c(n-2))/denom;
dels=(-b(n+1)*c(n-1)+b(n)*c(n))/denom;
e=abs((delr)+(dels));
r=r+delr;
s=s+dels;
end
end
disp(['Quadratic factor at ',num2str(z),' =x^2-',num2str(r),'x-',num2str(s)]);
x1=(r+(r^2+4*s)^(1/2))/2;
x2=(r-(r^2+4*s)^(1/2))/2;
disp('The result is');
disp(['x',num2str(k),'=',num2str(x1)]);
disp(['x',num2str(k+1),'=',num2str(x2)]);
z=z+1;
k=k+2;
n=n-2;
v=[1 -r -s];
m=deconv(a,v);
a=m;
end
if mod(n,2)==1;
x3=-a(2)/a(1);
disp(['x',num2str(k),'=',num2str(x3)]);
else
x4=(-a(2)+(a(2)^2-4*a(3))^(1/2))/2;
x5=(-a(2)-(a(2)^2-4*a(3))^(1/2))/2;
disp(['x',num2str(k),'=',num2str(x4)]);
disp(['x',num2str(k+1),'=',num2str(x5)]);
end
disp(['Actual tolerance for error= ', num2str(e)]);
disp(['Iteration number= ', num2str(ite)]);
اگر به حلقه while n>=3 دقت کنید، متوجه می شوید که دو end برای آن نوشته اید (دو end در پایان حلقه). بنابراین شما باید دوباره کل فرمول ها و روند برنامه نویسی رو چک کنید.
در ضمن، میشه مقادیری که گفتید رو به صورت دستی در برنامه نوشت که مرتب مجبور به وارد کردن آنها نباشید، من این کار رو کردم و همچنین مقداری کدها رو تغییر دادم تا متوجه بشید در حلقه while چه اتفاقی میفته (این کد تصحیح شده نیست و تنها مقادیر را به صورت دستی در برنامه نوشته ایم) :
کد:clear all
close all
clc
disp('Polynominal Equation: a1.X^(n)+ a2.X^(n-1)+ ….+an.X^(0)');
disp('Quadratic factor: x^2-rx-s');
n=5; % input('Polynominal degree, n=');
a=[1 2 3.25 0.01 -0.36 1];
r=-1; % input(' Please insert value of r=');
s=-1; % input(' Please insert value of s=');
tol=0.002; % input('Tolerance for error=');
k=1;
z=1;
ite=0;
disp('-------------------------')
while n>=3;
disp('in while loop')
e=1;
while e>tol;
ite=ite+1;
for i=1:n+1;
if i==1;
b(i)=a(i);
c(i)=b(i);
else if i==2;
b(i)=a(i)+r*b(i-1);
c(i)=b(i)-r*c(i-1);
else
b(i)=a(i)+r*b(i-1)+s*b(i-2);
c(i)=a(i)-r*c(i-1)-s*c(i-2);
end
end
end
disp('-------------------------')
denom=c(n-1)^2-c(n)*c(n-2)
if denom==0;
r=r+1;
s=s-1;
E=1;
else
delr=(-b(n)*c(n-1)+b(n+1)*c(n-2))/denom
dels=(-b(n+1)*c(n-1)+b(n)*c(n))/denom
e=abs((delr)+(dels));
r=r+delr;
s=s+dels;
end
end
r
s
disp('-------------------------')
disp(['Quadratic factor at ',num2str(z),' =x^2-',num2str(r),'x-',num2str(s)]);
x1=(r+(r^2+4*s)^(1/2))/2;
x2=(r-(r^2+4*s)^(1/2))/2;
disp('The result is');
disp(['x',num2str(k),'=',num2str(x1)]);
disp(['x',num2str(k+1),'=',num2str(x2)]);
z=z+1;
k=k+2;
n=n-2;
v=[1 -r -s];
m=deconv(a,v);
a=m;
end
if mod(n,2)==1;
x3=-a(2)/a(1);
disp(['x',num2str(k),'=',num2str(x3)]);
else
x4=(-a(2)+(a(2)^2-4*a(3))^(1/2))/2;
x5=(-a(2)-(a(2)^2-4*a(3))^(1/2))/2;
disp(['x',num2str(k),'=',num2str(x4)]);
disp(['x',num2str(k+1),'=',num2str(x5)]);
end
disp(['Actual tolerance for error= ', num2str(e)]);
disp(['Iteration number= ', num2str(ite)]);
متشکرم از لطفت ، هنوز امتحان نکردم ... راستش من خودم مطلب رو یاد گرفتم و متاسفانه این ریزه کاریهارو بلد نیستم. تنها هنرم اینه که از خود ایرادهای مطلب شاید یچی حالیم بشه
دانشجوی ارشد مکانیک هستم و خب تو دوره لیسانس خودم یاد گرفتم البته با کمک یه کتاب بسیار عالی و نایاب. بخاطر همین اینطور اشتباهات برام بوجود میاد و بدبختانه من الگوریتم بلد نیستم . اگه میشه یکم این ریزه کاریها رو هم بهم یاد بدی که چک کردن برنامه رو هم یاد بگیرم ممنونت میشم .....