1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

16 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 189,98 KB

Nội dung

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 1

TRƯỜ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 2

Hì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 3

Phươ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 4

f1=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 5

disp('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 7

Hì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 8

f = @(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 9

Hì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 10

f = @(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 11

Hì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 12

solanlap = '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 13

end

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 14

Hì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 15

a = -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 16

Hì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

Ngày đăng: 03/11/2024, 10:46

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w