Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Phương pháp Secant giải phương trình phi tuyến


Giới thiệu

Phương pháp Secant cũng được dùng để giải phương trình phi tuyến. Phương pháp này tương tự như phương pháp Newton-Raphson, nhưng ở đây ta không cần tìm đạo hàm của hàm f(x). Chỉ dùng f(x), ta có thể tìm f'(x) số học bằng công thức sai phân Newton. Từ công thức Newton-Raphson, ta biết rằng:

Phương pháp Secant giải phương trình phi tuyến

Bây giờ, dùng công thức sai phân, ta được:

Phương pháp Secant giải phương trình phi tuyếnPhương pháp Secant giải phương trình phi tuyếnPhương pháp Secant giải phương trình phi tuyến

Thay f'(x) của công thức Newton-Raphson bằng f'(x) mới, ta có công thức Secant để giải phương trình phi tuyến.

Phương pháp Secant giải phương trình phi tuyến

Lưu ý: Đối với phương pháp này, ta cần hai giá trị khởi tạo bất kỳ để bắt đầu tìm nghiệm của phương trình phi tuyến.

Đầu vào và Đầu ra

Đầu vào: Hàm f(x) = (x*x) - (4*x) - 10
Đầu ra: Nghiệm là: -1.74166

Thuật toán

secant(x1, x2)
Đầu vào: Hai giá trị khởi tạo cho nghiệm.
Đầu ra: Nghiệm xấp xỉ của phương trình phi tuyến f(x).

Begin
    f1 := f(x1)
    f2 := f(x2)
    x3 := ((f2*x1) – (f1*x2)) / (f2 – f1)
    while relative error of x3 and x2 are > precision, do
        x1 := x2
        f1 := f2
        x2 := x3
        f2 := f(x2)
        x3 := ((f2*x1) – (f1*x2)) / (f2 – f1)
    done
    root := x3
    return root
End

Ví dụ (C++)

#include <iostream>
#include <cmath>
using namespace std;

double absolute(double value) {
    // để tìm giá trị tuyệt đối
    if(value < 0)
        return (-value);
    return value;
}

double f(double x) {
    // hàm đã cho x^2-4x-10
    return ((x*x)-(4*x)-10);
}

double secant(double x1, double x2) {
    double x3, root;
    double f1, f2;
    f1 = f(x1);
    f2 = f(x2);
    x3 = (f2*x1-f1*x2)/(f2-f1);
    while(absolute((x3-x2)/x3) > 0.00001) {
        // kiểm tra độ chính xác của x3
        x1 = x2;  // dịch giá trị x
        f1 = f2;
        x2 = x3;
        f2 = f(x2);  // tìm x2 mới
        x3 = (f2*x1-f1*x2)/(f2-f1);  // tính x3
    }
    root = x3;
    return root;  // nghiệm của phương trình
}

main() {
    double a, b, res;
    a = 0.5;
    b = 0.75;
    res = secant(a, b);
    cout << "The root is: " << res;
}

Kết quả

The root is: -1.74166