Kết quả của f’’5Câu 2: Viết hàm function trong MATLAB để thực hiện các phương pháp chia đôi, lặp, tiếp tuyến Newton và dây cung với định dạng tín hiệu vào và ra như sau: Phương pháp chia
Trang 1TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
Họ và tên: Lưu Thái Phúc
MSSV: 21200330
Lớp: 22DTV_TH
THỰC HÀNH PHƯƠNG PHÁP TÍNH VÀ MATLAB
GVPT: Nguyễn Mai Minh Kha BÁO CÁO THỰC HÀNH TUẦN 4
Câu 1: Tạo phương trình f(x) = x3 + 5x2 - 9x + 2 dưới dạng symfun trong MATLAB
Tính f(2) Tìm đạo hàm cấp hai f ”(x) và tính f ”(5).
syms x;
fx= symfun(x^3 + 5*(x^2) - 9*x + 2, x);
fx(2)
Hình 1 Kết quả của f(2)
syms x;
fx= symfun(x^3 + 5*(x^2) - 9*x + 2, x);
fd2 = diff(diff(fx,x),x);
fd2(5)
Trang 2Hình 2 Kết quả của f’’(5)
Câu 2: Viết hàm (function) trong MATLAB để thực hiện các phương pháp chia đôi, lặp, tiếp tuyến (Newton) và dây cung với định dạng tín hiệu vào và ra như sau:
Phương pháp chia đôi:
function [nghiem,solanlap] = chiadoi(f,a,b,saiso)
function [nghiem,solanlap] =chiadoi(f, a, b, saiso)
solanlap=0;
if f(a)*f(b)>0
disp('Khong co nghiem trong khoang nay');
else
while(abs(a-b)>=saiso)
nghiem=(a+b)/2;
if f(a)*f(nghiem)<0
b=nghiem;
else
a=nghiem;
end
solanlap=solanlap+1;
end
end
end
Trang 3Phương pháp lặp:
function [nghiem,solanlap] = lap(fp,a,b,saiso)
function [nghiem,solanlap] = lap(fp,f,a,b,saiso)
if(f(a)*f(b)>0)
disp('Khong co nghiem trong khoang nay');
else
y=(a+b)/2;
solanlap=0;
e=saiso+1;
while(e>saiso)
nghiem=fp(y);
e=abs(nghiem-y);
y=nghiem;
solanlap=solanlap+1;
end
end
end
Phương pháp tiếp tuyến:
function [nghiem,solanlap] = tieptuyen(f,a,b,saiso)
function [nghiem,solanlap] = tieptuyen(f,a,b,saiso) syms x;
if(f(a)*f(b)>0)
disp('Khong co nghiem trong khoang nay');
Trang 4f1=str2func(['@(x)' char(diff(f(x)))]);
f2=str2func(['@(x)' char(diff(f1(x)))]);
for i=a:0.1:b
if (f(i)*f2(i)>0)
x0=i;
break
end
end
xT=x0;
solanlap=0;
e=saiso+1;
while(e>saiso)
nghiem=xT-f(xT)/f1(xT);
e=abs(nghiem-xT);
xT=nghiem;
solanlap=solanlap+1;
end
end
end
Phương pháp dây cung:
function [nghiem,solanlap] = daycung(f,a,b,saiso)
function [nghiem,solanlap] = daycung(f,a,b,saiso) if(f(a)*f(b)>0)
Trang 5disp('Khong co nghiem trong khoang nay'); else
tam=a;
solanlap=0;
e=saiso+1;
while(e>saiso)
nghiem=(a*f(b)-b*f(a))/(f(b)-f(a)); e=abs(nghiem-tam);
tam=nghiem;
if(f(nghiem)*f(a)<0)
b=nghiem;
else
a=nghiem;
end
solanlap=solanlap+1;
end
end
end
Trong đó:
• f là hàm cần tìm nghiệm gần đúng (tức f(x))
• fp là hàm lặp của f
• [a,b] là khoảng phân li nghiệm
• saiso là sai số cho phép
• nghiem là nghiệm gần đúng
Trang 6• solanlap là số lần lặp của thuật toán trong phương pháp
a Tìm nghiệm gần đúng và số lần lặp của phương trình 3𝑥3 - 8𝑥2 = 20𝑥 - 16 theo 4
phương pháp trên, với khoảng phân li nghiệm [0.2, 1] và sai số không lớn hơn 0.005.
Phương pháp nào cho số lần lặp ít nhất Vì sao?
syms x;
f = @(x) 3*(x^3) - 8*(x^2) - 20*x + 16;
a = 0.2; b = 1;
saiso = 0.005;
[nghiem,solanlap] = chiadoi(f,a,b,saiso)
Hình 3 Nghiệm và số lần lặp phương pháp chia đôi
syms x;
f = @(x) 3*(x^3) - 8*(x^2) - 20*x + 16;
fp = f;
a = 0.2; b = 1;
saiso = 0.005;
[nghiem,solanlap] = lap(fp,f,a,b,saiso)
Trang 7Hình 4 Nghiệm và số lần lặp phương pháp lặp
syms x;
f = @(x) 3*(x^3) - 8*(x^2) - 20*x + 16;
a = 0.2; b = 1;
saiso = 0.005;
[nghiem,solanlap] = tieptuyen(f,a,b,saiso)
Hình 5 Nghiệm và số lần lặp phương pháp tiếp tuyến
syms x;
Trang 8f = @(x) 3*(x^3) - 8*(x^2) - 20*x + 16;
a = 0.2; b = 1;
saiso = 0.005;
[nghiem,solanlap] = daycung(f,a,b,saiso)
Hình 6 Nghiệm và số lần lặp phương pháp dây cung
b Tìm nghiệm gần đúng và số lần lặp của phương trình 𝑥– 𝑠in𝑥 = 0.25 theo 4 phương
pháp trên, với khoảng phân li nghiệm [-1, 2] và sai số không lớn hơn 0.005 Phương
pháp nào cho số lần lặp nhiều nhất Vì sao?
syms x;
f = @(x) x - sin(x) - 0.25;
a = -1; b = 2;
saiso = 0.005;
[nghiem,solanlap] = chiadoi(f,a,b,saiso)
Trang 9Hình 7 Nghiệm và số lần lặp phương pháp chia đôi
syms x;
f = @(x) x - sin(x) - 0.25;
fp = @(x) sin(x) + 0.25;
a = -1; b = 2;
saiso = 0.005;
[nghiem,solanlap] = lap(fp,f,a,b,saiso)
Hình 8 Nghiệm và số lần lặp phương pháp lặp
syms x;
Trang 10f = @(x) x - sin(x) - 0.25;
a = -1; b = 2;
saiso = 0.005;
[nghiem,solanlap] = tieptuyen(f,a,b,saiso)
Hình 9 Nghiệm và số lần lặp phương pháp tiếp tuyến
syms x;
f = @(x) x - sin(x) - 0.25;
a = -1; b = 2;
saiso = 0.005;
[nghiem,solanlap] = daycung(f,a,b,saiso)
Trang 11Hình 10 Nghiệm và số lần lặp phương pháp dây cung
c Bổ sung đoạn code sau vào thuật toán phương pháp tiếp tuyến (2đ):
function [nghiem,solanlap] = tieptuyen(f,a,b,saiso)
syms x;
fd1 = str2func(['@(x)' char(diff(f(x)))]);
fd2 = str2func(['@(x)' char(diff(fd1(x)))]);
nostop = 1;
temp1 = double(solve(diff(f(x))));
temp2 = double(solve(diff(fd1(x))));
%Kiem tra f'(x) co doi dau trong khoang phan li nghiem hay khong
if ~isempty(temp1)
for i=1:length(temp1)
if (temp1(i)<=b) && (temp1(i)>=a)
disp('Ham f'' doi dau trong khoang phan li nghiem');
nostop=0;
nghiem = 'khong xac dinh';
Trang 12solanlap = 'khong xac dinh';
break;
end
end
end
%Kiem tra f"(x) co doi dau trong khoang phan li nghiem hay ko
if ~isempty(temp2)
for i=1:length(temp2)
if (temp2(i)<=b) && (temp2(i)>=a)
disp('Ham f" doi dau trong khoang phan li
nghiem');
nostop=0;
nghiem = 'khong xac dinh';
solanlap = 'khong xac dinh';
break;
end
end
end
if (nostop)
%thuật toán phương pháp tiếp tuyến
for i=a:0.1:b
if (f(i)*fd2(i)>0)
x0=i;
break
end
Trang 13end
xT=x0;
solanlap=0;
e=saiso+1;
while(e>saiso)
nghiem=xT-f(xT)/fd1(xT);
e=abs(nghiem-xT);
xT=nghiem;
solanlap=solanlap+1;
end
end
end % ket thuc function
Dùng phương pháp chia đôi và tiếp tuyến để tính gần đúng nghiệm của phương trình
𝑥2– 𝑠in𝜋𝑥 = 0 với sai số nhỏ hơn 5×10 -5 và khoảng phân li nghiệm:
a [-0.5, 0.5]
syms x;
f = @(x) x^2 - sin(pi*x);
a = -0.5; b = 0.5;
saiso = 5*10^(-5);
[nghiem,solanlap] = tieptuyen(f,a,b,saiso)
Trang 14Hình 11 Nghiệm và số lần lặp phương pháp tiếp tuyến ở khoảng [-0.5, 0.5]
syms x;
f = @(x) x^2 - sin(pi*x);
a = -0.5; b = 0.5;
saiso = 5*10^(-5);
[nghiem,solanlap] = chiadoi(f,a,b,saiso)
Hình 12 Nghiệm và số lần lặp phương pháp chia đôi ở khoảng [-0.5, 0.5]
b [-0.05, 0.5]
syms x;
f = @(x) x^2 - sin(pi*x);
Trang 15a = -0.05; b = 0.5;
saiso = 5*10^(-5);
[nghiem,solanlap] = tieptuyen(f,a,b,saiso)
Hình 13 Nghiệm và số lần lặp phương pháp tiếp tuyến ở khoảng [-0.05, 0.5]
syms x;
f = @(x) x^2 - sin(pi*x);
a = -0.05; b = 0.5;
saiso = 5*10^(-5);
[nghiem,solanlap] = chiadoi(f,a,b,saiso)
Trang 16Hình 14 Nghiệm và số lần lặp phương pháp tiếp tuyến ở khoảng [-0.05, 0.5]
c Giải thích sự khác biệt giữa trường hợp câu a và b