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


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

Bairstow method

#6
قسمتی از کدها رو اشتباه نوشتید، من برنامه خودتون رو با مرتب کردن و تصحیح فواصل مربوط به حلقه ها در اینجا میارم (حالا میگم اشتباه در کجاست) :



کد:
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)]);
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ


پیام‌های این موضوع
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 مهمان