Persamaan Non-Linear

Persamaan non-linear merupakan persamaan yang tidak mengandung syarat seperti persamaan linear, bisa berupa pangkat seperti \(x^2\) ataupun produk 2 variabel seperti \(xy.\) Akar-akar persamaan non-linear merupakan titik potong kurva \(f(x)\) dengan sumbu \(x\) atau nilai \(x\) yang menyebabkan nilai \(f(x) = 0.\) Cara mendapatkannya bisa menggunakan berbagai metode,seperti metode tabel, Bisection, Newton-Raphson, dan Secant.

Metode Tabel

Metode ini menggunakan tabel yang berisi nilai fungsi untuk beberapa titik yang telah ditentukan. Metode ini menggunakan biseksi untuk mencari titik tertentu yang memberikan nilai minimum atau maksimum.

  • Algoritma:

    1. Buat tabel dengan kolom untuk nilai x dan f(x).

    2. Untuk setiap baris di tabel, hitung f(x) dan simpan nilainya.

    3. Cari nilai x yang memiliki nilai f(x) terkecil atau terbesar sesuai dengan permasalahan.

  • Fungsi R:

    table_method <- function(f, a, b, n = 100, method = "min") {
      x <- seq(a, b, length.out = n)
      y <- sapply(x, f)
      if (method == "min") {
        return(list(data=data.frame(x,y),x.opt=x[which.min(y)],y.opt=f(x[which.min(y)])))
      } else if (method == "max") {
        return(list(data=data.frame(x,y),x.opt=x[which.max(y)],y.opt=f(x[which.max(y)])))
      }
    }
  • Contoh Soal: Temukan nilai x yang membuat f(x) terkecil di fungsi \(f(x) = 3x^{3} +\frac{2}{x^{\sqrt{2}}}\), dengan batas x antara -1 sampai 1.

    # Contoh penerapan
    f <- function(x) 3*x^3+2*x^-1/2
    table_method(f, -1, 1,n=10,method="min")
    ## $data
    ##             x         y
    ## 1  -1.0000000 -4.000000
    ## 2  -0.7777778 -2.697237
    ## 3  -0.5555556 -2.314403
    ## 4  -0.3333333 -3.111111
    ## 5  -0.1111111 -9.004115
    ## 6   0.1111111  9.004115
    ## 7   0.3333333  3.111111
    ## 8   0.5555556  2.314403
    ## 9   0.7777778  2.697237
    ## 10  1.0000000  4.000000
    ## 
    ## $x.opt
    ## [1] -0.1111111
    ## 
    ## $y.opt
    ## [1] -9.004115

  • Perlu dicermati bahwa pada grafik terlihat terdapat 2 kurva pada 1 fungsi yaitu antara {-1,0) dan {0,1}, sehingga jika dilihat pada output sebelumnya, hanya menghasilkan hasil minimum pada rentang {-1,0}. Maka, jika ingin menemukan titik minimum pada rentang {0,1} tinggal ubah saja rentangnya sebagai berikut.

    table_method(f, 0, 1,n=10,method="min")
    ## $data
    ##            x        y
    ## 1  0.0000000      Inf
    ## 2  0.1111111 9.004115
    ## 3  0.2222222 4.532922
    ## 4  0.3333333 3.111111
    ## 5  0.4444444 2.513374
    ## 6  0.5555556 2.314403
    ## 7  0.6666667 2.388889
    ## 8  0.7777778 2.697237
    ## 9  0.8888889 3.231996
    ## 10 1.0000000 4.000000
    ## 
    ## $x.opt
    ## [1] 0.5555556
    ## 
    ## $y.opt
    ## [1] 2.314403

Metode Bisection

Metode Biseksi adalah metode optimasi yang menggunakan pemotongan interval untuk mencari titik minimum atau maksimum. Metode ini hanya berlaku jika fungsi kontinu dan berubah sign dalam interval [a, b].

  • Algoritma:

    1. Definisikan fungsi f(x) dan interval [a, b] di mana kita ingin menemukan akar.

    2. Pastikan bahwa f(a) dan f(b) memiliki tanda yang berbeda (artinya, f(a) * f(b) < 0).

    3. Hitung c = (a + b) / 2.

    4. Jika f(c) = 0, maka c adalah akar persamaan.

    5. Jika f(c) * f(a) < 0, maka gunakan interval [a, c].

    6. Jika f(c) * f(b) < 0, maka gunakan interval [c, b].

    7. Ulangi langkah 3 hingga 6 hingga akurasi yang diinginkan dicapai.

  • Fungsi R

    bisection_method <- function(f, a, b, tol = 1e-6, max_iter = 100) {
      if (f(a) * f(b) > 0) {
        stop("f(a) dan f(b) harus beda tanda.")
      }
      iter <- 0
    
      while (b - a > tol && iter < max_iter) {
        c <- (a + b) / 2
        if (f(c) == 0) {
          return(list(x.opt=c,y.opt=f(c)))
        }
        if (f(a) * f(c) < 0) {
          b <- c
        } else {
          a <- c
        }
        iter <- iter + 1
      }
      return(list(`function`=f,iter=iter,x.opt=mean(c(a, b)),y.opt=f(mean(c(a, b)))))
    }
  • Contoh Soal: Temukan nilai x yang membuat f(x) terkecil masih pada fungsi \(f(x) = 3x^{3} +\frac{2}{x^{\sqrt{2}}}\), dengan batas x antara -1 sampai 0.

  • # Contoh penerapan
        bisection_method(f, -1, 0)
    ## $`function`
    ## function(x) 3*x^3+2*x^-1/2
    ## <bytecode: 0x0000021431df3d98>
    ## 
    ## $iter
    ## [1] 20
    ## 
    ## $x.opt
    ## [1] -4.768372e-07
    ## 
    ## $y.opt
    ## [1] -2097152

    Bila dibandingkan dengan metode tabel, bisection method menghasilkan nilai x yang jauh lebih meminimumkan y

    #Atur max iter dan toleransi bisa mengubah hasil
    bisection_method(f, -1, 0,max_iter = 1000,tol=1e-07)
    ## $`function`
    ## function(x) 3*x^3+2*x^-1/2
    ## <bytecode: 0x0000021431df3d98>
    ## 
    ## $iter
    ## [1] 24
    ## 
    ## $x.opt
    ## [1] -2.980232e-08
    ## 
    ## $y.opt
    ## [1] -33554432
  • Memperbesar max_iter dan memperkecil batas toleransi menghasilkan nilai yang lebih minimum

  • Masih pada fungsi yang sama, \(f(x) = 3x^{3} +\frac{2}{x^{\sqrt{2}}}\), tapi batas x dari -2 sampai 0.

    #Batas a dan b yang berbeda tentu bisa menghasilkan hasil yang berbeda walau pada 1 fungsi
    bisection_method(f, -2, 0,max_iter = 1000,tol=1e-07)
    ## $`function`
    ## function(x) 3*x^3+2*x^-1/2
    ## <bytecode: 0x0000021431df3d98>
    ## 
    ## $iter
    ## [1] 25
    ## 
    ## $x.opt
    ## [1] -2.980232e-08
    ## 
    ## $y.opt
    ## [1] -33554432

    Kurva nampak berbeda dengan sebelumnya meski tetap pada 1 fungsi yang sama

Metode Newton-Raphson

Newton-Raphson adalah metode iteratif untuk menemukan akar dari fungsi nonlinier. Algoritma Newton-Raphson bekerja dengan menghitung tanda turunan dari fungsi di suatu titik, menggunakannya untuk menghitung persamaan garis tangent, dan menggunakannya untuk menentukan titik berikutnya sebagai akar persamaan garis tangent.

  • Algoritma:

    1. Mulai dengan nilai awal () yang akan digunakan sebagai asumsi untuk akar persamaan.

    2. Hitung \(f(x_0)\) dan \(f'(x_0)\), turunan pertama dari fungsi \(f(x)\) di titik \(x_0\).

    3. Hitung langkah iterasi baru menggunakan persamaan \(x_{n+1}\) di atas.

    4. Ulangi langkah 2 dan 3 hingga nilai akar stabil atau konvergen tercapai, yaitu ketika: $$|x_{n+1} - x_n|<toleransi$$

  • Fungsi R

    newton_method <- function(f, df, x0, tol=1e-7, max_iter=100){
      iter <- 0
      xold<-x0
      xnew <- xold + 10*tol
    
      while(abs(xnew-xold)>tol){
        iter <- iter+1
        xold<-xnew
        xnew <- xold - f(xold)/df(xold)
      }
        root<-xnew
      if(iter>max_iter){
          cat("Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke ",iter,"dengan x = ",round(xnew),"dan y = ",round(f(xnew)))
      }
      else{
          return(list(`function`=f, x.opt=root,y.opt=f(root), iter=iter))
    }
      }  
  • Contoh Soal: Temukan nilai x yang membuat f(x) terkecil masih pada fungsi \(f(x) = 3x^{3} +\frac{2}{x^{\sqrt{2}}}\). Apakah bisa?

    df<-Deriv::Deriv(f,"x")
    newton_method(f,df,x0=0,max_iter=1000,tol=1e-4)
    ## Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke  24872 dengan x =  0 dan y =  22797
  • Dalam kasus ini, algoritma mungkin tidak berhenti karena perbedaan antara x saat ini dan x sebelumnya selalu lebih besar dari toleransi. Ini mungkin terjadi karena fungsi dan turunannya tidak terdefinisi di sekitar akar yang diinginkan atau karena akar yang diinginkan tidak ada. Maka, bisa menggunakan metode bisection ataupun secant.

Metode Secant

Metode secant adalah salah satu metode iteratif untuk mencari akar dari fungsi real-valued. Metode ini lebih sederhana daripada Metode Newton-Raphson karena tidak memerlukan turunan fungsi. 

  • Algoritma:

    1. Tentukan fungsi \(f(x)\) dan nilai awal \(x_0\) dan \(x_1\).

    2. Ulangi langkah berikut sampai kondisi berhenti:

      a. Hitung \(f(x_0\)) dan \(f(x_1)\).

      b. Perbarui nilai \(x_1\) dengan persamaan \(x_{n+1}\) di atas .

      c. Tetapkan \(x_0\) sebagai \(x_1\).

      d. Periksa apakah perbedaan antara \(x_1\) saat ini dan \(x_1\) sebelumnya kurang dari toleransi tol. Jika ya, maka akar telah ditemukan dan algoritma berhenti. Jika tidak, maka lanjutkan ke langkah berikutnya.

  • Fungsi R:

    secant_method <- function(f, x, tol=1e-7, max_iter=100){
      iter <- 0
      xold <- x
      fxold <- f(x)
      x <- xold+10*tol
    
      while(abs(x-xold)>tol){
    iter <- iter+1
    fx <- f(x)
    xnew <- x - fx*((x-xold)/(fx-fxold))
    xold <- x
    fxold <- fx
    x <- xnew
      }
     if(iter>max_iter){
      cat("Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke ",iter,"dengan x = ",round(xnew),"dan y = ",round(f(xnew)))
      }
    
    else{
      root<-xnew
      return(list(`function`=f, x.opt=root,y.opt=f(root), iter=iter))
    }
    }
  • Contoh Soal: Temukan nilai x yang membuat f(x) terkecil masih pada fungsi \(f(x) = 3x^{3} +\frac{2}{x^{\sqrt{2}}}\). Apakah bisa?

    secant_method(f,x=8,max_iter=100)
    ## Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke  17315 dengan x =  -1 dan y =  -2
  • Dalam kasus ini, algoritma secant juga tidak berhenti sehingga akar yang diinginkan tidak ada. Hal ini dapat diamati dari bentuk kurva yang terbagi dalam selang tertentu serta tiap selang secara sekilas cenderung susah menemukan titik optimum (baik minimum maupun maksimum).

  • Dengan kata lain, algoritma iteratif seperti secant dan newton raphson tidak akan berjalan dengan baik pada fungsi yang memiliki >1 kurva (misal 2 akar penyelesaian), karena metode iteratif ini mengasumsikan bahwa fungsi hanya memiliki 1 akar, sehingga algoritma akan melompat dari kurva yang satu ke kurva lain, sehingga tidak akan pernah berhenti pada akar yang diinginkan.