Tải bản đầy đủ (.pdf) (4 trang)

tài liệu môn giải tích số giải đa thức bậc n

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (196.85 KB, 4 trang )

GIẢI ĐA THỨC BẬC N
1.Trình bày thuật toán:
Input: Đa thức bậc n có dạng a0 xn + a1 xn-1 + …… + an-1 x + an = 0 (a0 ≠ 0) và sai
số ε cho trước
Output: Nghiệm của đa thức bậc n
Các phương pháp:
• Phương pháp tiếp tuyến để tìm nghiệm bởi tiếp không cần chọn đúng x0
vẫn thực hiện được
• Hoocne tìm đa thức mới không chứa nghiệm của đa thức cũ => bậc đa thức
mới giảm 1 bậc so với đa thức cũ
Tóm tắt thuật toán:
Bước 1: Kiểm tra bậc đa thức n=1 thông báo nghiệm x = -

a1
a0

và STOP.

Bước 2: Chọn x0 = 0 . Nếu f’(x0 ) = 0 thì x0 := x0 + c ,(c = hằng số tùy ý)
Bước 3: Thực hiện 9999 vòng lặp để tính:
xn = xn-1 -

f(xn-1 )
f'(xn-1 )

,n=1,2,…..,9999

Nếu |f(x9999 )>0| => Vô nghiệm => STOP.
Nếu |xn -xn-1|< ε thì x = xn là 1 nghiệm đa thức và thông báo nghiệm => Chuyển
sang Bước 4
Bước 4: Sử dụng Hoocne để tách được đa thức mới không chứa nghiệm vừa tìm


được, bậc giảm 1 so với đa thức cũ.
Hệ số của đa thức mới:
ai = ai + ai-1x
Quay lại Bước 1;

, i=1,…,n-1


Code:
using System;
namespace Giai_phuong_trinh_bac_n
{
class Program
{
static double[] a = new double[1000];
static int n,KL;
static double f(double x)
{
double p = 0;
for(int i=0;i<=n ;i++ )
{
p = p * x + a[i];
}
return p;
}
static double fdh(double x)
{
double p = 0;
int m;
m = n;

for(int i=0;i<=n-1 ;i++ )
{
p = p * x + m * a[i];
m = m - 1;
}
return p;
}
static double GiaiNghiem(double x)
{
double xs = 0;
int start,finish;
start = 0;
finish = 10000;
if (n == 1)
{
if (a[0]!=0) return -a[1] / a[0];
else return KL = 1;
}
while (fdh(x)==0)
{
x = x + 0.76543;
}


while (start{
if (start==(finish-1))
if (Math.Abs(f(x)) > 0.1) KL = 1;
xs = x;
x = x - (f(x) / fdh(x));

if (Math.Abs(x-xs) < 0.000000001) return x;
start++;
}
return x;
}
static void chiadathuc(double x)
{
for(int i=1;i{
a[i] = a[i] + a[i-1] * x;
}
n=n-1;
}
static void Main(string[] args)
{
double x;
int T = 0;
do
{
Console.Write("Giai da thuc bac n voi (n>0), nhap n=
");
n = Int32.Parse(Console.ReadLine());
}
while (n <= 0);
Console.WriteLine("\nNhap cac he so:");
do
{
Console.Write("x^{0} (Khac 0) = ", n);
a[0] = Double.Parse(Console.ReadLine());
} while (a[0] == 0);

for(int i=1;i<=n;i++)
{
Console.Write("x^{0} = ", n - i);
a[i] = Double.Parse(Console.ReadLine());
}
while(n>0)
{
x = GiaiNghiem(0);


if (KL == 1){if(T==0) Console.WriteLine("PT vo
nghiem");break; }
if (T == 0) Console.WriteLine("\nPhuong trinh co
nghiem la:");
Console.WriteLine("X= {0}", x);
chiadathuc(x);
T = 1;
}
Console.ReadKey();
}
}
}



×