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

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



โดยการแทน f'(x) ของสูตร Newton-Raphson ด้วย f'(x) ใหม่ เราจะได้สูตร 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