Mencari akar sebuah fungsi menggunakan metode secant

Artikel ini untuk mengeksplorasi kemampuan Ghost menampilkan formula matematika \( {\LaTeX} \), menguji dukungan syntax highlighting dan line numbering kode sumber agar konten teknis lebih menarik.

Mencari akar sebuah fungsi menggunakan metode secant
Photo by Antoine Dautry / Unsplash

Metode secant digunakan untuk mencari akar persamaan \( f(x) = 0 \). Metode ini dimulai dari dua taksiran berbeda \( x_1 \) dan \( x_2 \)  untuk akarnya. Ini adalah prosedur iteratif yang melibatkan interpolasi linier ke akar. Iterasi berhenti jika perbedaan antara dua nilai antara lebih kecil dari faktor konvergensi. Contoh fungsi sederhana:

\[ 2+x=5 \]

akan dengan mudah dibalik sehingga nilai \( x \) bisa ditemukan dengan fungsi:

\[ x=5-2 \]

Bagaimana jika fungsinya adalah:

\( \scriptsize y=4.86\times e^{\left( \frac{1}{x}\left( -5.94\times(1-x)+1.36\times(1-x)^{1.5}-0.47\times(1-x)^2 -1.54\times(1-x)^{4.5} \right) \right)} \)

Berapa nilai \( x \) jika \( y \) diketahui? Di sini kita memerlukan sebuah algoritma untuk membantu menemukan akar dari sebuah fungsi yang kompleks. Tulisan di sini terbatas pada metode secant dan sebuah contoh implementasi nyata.

Algoritma ini awalnya penulis perlukan karena ada kebutuhan untuk menghitung vapor temperature liquid Argon yang kemudian akan digunakan untuk menghitung liquid density. Penulis menemukan referensi dan properti liquid Argon yang cukup lengkap dari BNL Group tetapi alih-alih menggunakan Antoine equtation yang lebih sederhana dan mudah dibalik, ternyata menggunakan Wagner equtation yang rumit.

Mari kita mulai dengan membaca referensi dan kode dari GeeksforGeeks, implementasi JavaScript saya salin di sini:

<script>
// JavaScript Program to find root of an
// equations using secant method

// function takes value of x and returns f(x)
function f(x)
{
	// we are taking equation as x^3+x-1
	let f = Math.pow(x, 3) + x - 1;
	return f;
}

function secant(x1, x2, E)
{
	let n = 0, xm, x0, c;
	if (f(x1) * f(x2) < 0) {
		do {
			// calculate the intermediate value
			x0 = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));

			// check if x0 is root of equation or not
			c = f(x1) * f(x0);

			// update the value of interval
			x1 = x2;
			x2 = x0;

			// update number of iteration
			n++;

			// if x0 is the root of equation then break the loop
			if (c == 0)
				break;
			xm = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
		} while (Math.abs(xm - x0) >= E); // repeat the loop
								// until the convergence

		document.write("Root of the given equation=" + x0.toFixed(6) + "<br>");
		document.write("No. of iterations = " + n + "<br>");
	} else
		document.write("Can not find a root in the given interval");
}

// Driver code
	// initializing the values
	let x1 = 0, x2 = 1, E = 0.0001;
	secant(x1, x2, E);


// This code is contributed by Surbhi Tyagi.
</script>

Anda bisa melakukan pengujian script di atas di JavaScript Online Editor milik W3Schools dengan sepenuhnya mengganti seluruh bagian script dengan script di atas.

Selanjutnya kalaupun Anda masih bingung, mari kita sederhanakan fungsi dari BNL:

\[ \scriptsize p_b=p_c\times e^{\frac{T_c}{T}\left(a_1\phi+a_2\phi^{1.5}+a_3\phi^2+a_4\phi^{4.5}\right)} \]

dengan: \( \scriptsize \phi=(1-T/T_c), \quad T_c = 150.687 \text{K}, \quad p_c = 4.863 \text{MPa}, \quad a_1 = -5.9409785, \\ a_2 = 1.3553888, \quad a_3 = -0.46497607, \quad a_4 = -1.5399043 \)

menjadi: \( \scriptsize y=p_c\times e^{{\left( \frac{1}{x}\left( a_1\times(1-x)+a_2\times(1-x)^{1.5}+a_3\times(1-x)^{2}+a_4\times(1-x)^{4.5} \right) \right)}}\allowbreak \)

atau bentuk input WolframAlpha:

y=4.863*e^(1/x*(-5.9409785*(1-x) + 1.3553888*(1-x)^1.5 - 0.46497607*(1-x)^2 - 1.5399043*(1-x)^4.5))

Kemudian kita memerlukan nilai \( x_1 \) dan \( x_2 \), WolframAlpha bisa membantu menemukan nilai x1 dan x2 itu. Kemudian kembali lagi ke JavaScript Online Editor milik W3Schools dengan sepenuhnya mengganti seluruh script dengan script berikut:

<script>
// JavaScript Program to find root of an
// equations using secant method

// function takes value of x and returns f(x)
function f(x, y)
{
	// we are taking equation as 4.863*e^(1/x*(-5.9409785*(1-x) + 1.3553888*(1-x)^1.5 + -0.46497607*(1-x)^2 + -1.5399043*(1-x)^4.5))
	let f = (-y + 4.863 * Math.exp((-5.9409785*(1 - x) + 1.3553888*Math.pow(1 - x,1.5) - 0.46497607*Math.pow(1 - x,2) - 1.5399043*Math.pow(1 - x,4.5))/x));
	return f;
}

function secant(x1, x2, E, y)
{
	let n = 0, xm, x0, c;
	if (f(x1, y) * f(x2, y) < 0) {
		do {
			// calculate the intermediate value
			x0 = (x1 * f(x2, y) - x2 * f(x1, y)) / (f(x2, y) - f(x1, y));

			// check if x0 is root of equation or not
			c = f(x1, y) * f(x0, y);

			// update the value of interval
			x1 = x2;
			x2 = x0;

			// update number of iteration
			n++;

			// if x0 is the root of equation then break the loop
			if (c == 0)
				break;
			xm = (x1 * f(x2, y) - x2 * f(x1, y)) / (f(x2, y) - f(x1, y));
		} while (Math.abs(xm - x0) >= E); // repeat the loop
								// until the convergence

		document.write("Root of the given equation=" + (x0*150.687).toFixed(6) + "<br>"); // temperature in K
		document.write("No. of iterations = " + n + "<br>");
	} else
		document.write("Can not find a root in the given interval");
}

// Driver code
	// initializing the values
	let x1 = 0.556158, x2 = 1.0, E = 0.00000001;
	secant(x1, x2, E, 0.101325); // pressure in MPa


// This code is contributed by Surbhi Tyagi, modified by Ketut Putu Kumajaya.
</script>

Dengan metode secant di atas maka kita bisa menduga temperatur liquid Argon berdasarkan saturated pavor pressure-nya. Dari temperatur, kemudian kita bisa menghitung density.