انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Bairstow method

Bairstow method

#7
(۱۳۹۲/۰۲/۲۷, ۱۲:۴۵ ق.ظ)'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)]);

 


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


پیام‌های این موضوع
Bairstow method - توسط babak84 - ۱۳۹۲/۰۲/۲۶, ۱۲:۰۲ ق.ظ
RE: Bairstow method - توسط admin - ۱۳۹۲/۰۲/۲۶, ۱۲:۱۳ ق.ظ
RE: Bairstow method - توسط babak84 - ۱۳۹۲/۰۲/۲۶, ۰۹:۳۴ ب.ظ
RE: Bairstow method - توسط admin - ۱۳۹۲/۰۲/۲۶, ۱۰:۴۳ ب.ظ
RE: Bairstow method - توسط babak84 - ۱۳۹۲/۰۲/۲۶, ۱۱:۳۸ ب.ظ
RE: Bairstow method - توسط admin - ۱۳۹۲/۰۲/۲۷, ۱۲:۴۵ ق.ظ
RE: Bairstow method - توسط babak84 - ۱۳۹۲/۰۲/۲۷, ۰۸:۲۳ ب.ظ
RE: Bairstow method - توسط admin - ۱۳۹۲/۰۲/۲۷, ۰۸:۵۴ ب.ظ
RE: Bairstow method - توسط babak84 - ۱۳۹۲/۰۲/۲۸, ۱۲:۲۴ ب.ظ
RE: Bairstow method - توسط admin - ۱۳۹۲/۰۲/۲۸, ۰۱:۲۶ ب.ظ

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان