Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

วิธี Secant แก้สมการไม่เชิงเส้น

บทนำ

วิธี Secant ใช้แก้สมการไม่เชิงเส้น (Non-linear Equations) เช่นกัน วิธีนี้คล้ายกับวิธี Newton-Raphson แต่ที่นี่เราไม่ต้องหาอนุพันธ์ของฟังก์ชัน f(x) เพียงใช้ f(x) เพียงอย่างเดียว เราสามารถหา f'(x) แบบตัวเลขได้โดยใช้สูตรความต่างหารของ Newton จากสูตร Newton-Raphson เราทราบว่า:

วิธี Secant แก้สมการไม่เชิงเส้น

ตอนนี้ใช้สูตรความต่างหาร เราจะได้:

วิธี Secant แก้สมการไม่เชิงเส้นวิธี Secant แก้สมการไม่เชิงเส้นวิธี Secant แก้สมการไม่เชิงเส้น

โดยการแทน f'(x) ของสูตร Newton-Raphson ด้วย f'(x) ใหม่ เราจะได้สูตร Secant สำหรับแก้สมการไม่เชิงเส้น:

วิธี Secant แก้สมการไม่เชิงเส้น

หมายเหตุ: สำหรับวิธีนี้ ต้องการค่าประมาณเริ่มต้นสองค่า เพื่อเริ่มหากลุ่มของสมการไม่เชิงเส้น

อินพุตและเอาต์พุต

Input: ฟังก์ชัน f(x) = (x*x) - (4*x) - 10
Output: รากคือ: -1.74166

อัลกอริทึม

secant(x1, x2)
Input: สองค่าประมาณเริ่มต้นสำหรับราก
Output: รากประมาณของสมการไม่เชิงเส้น f(x)

Begin
    f1 := f(x1)
    f2 := f(x2)
    x3 := ((f2*x1) - (f1*x2)) / (f2 - f1)
    while relative error ของ x3 และ x2 > precision, do
        x1 := x2
        f1 := f2
        x2 := x3
        f2 := f(x2)
        x3 := ((f2*x1) - (f1*x2)) / (f2 - f1)
    done
    root := x3
    return root
End

ตัวอย่างโค้ด (C++)

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

double absolute(double value) {
    // หาค่าสัมบูรณ์
    if (value < 0)
        return (-value);
    return value;
}

double f(double x) {
    // ฟังก์ชันที่กำหนด 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) {
        // ทดสอบความแม่นยำของ x3
        x1 = x2;  // เลื่อนค่า x
        f1 = f2;
        x2 = x3;
        f2 = f(x2);  // หา x2 ใหม่
        x3 = (f2*x1 - f1*x2) / (f2 - f1);  // คำนวณ x3
    }
    root = x3;
    return root;  // รากของสมการ
}

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

ผลลัพธ์

The root is: -1.74166