Advertisement
Guest User

Untitled

a guest
Mar 19th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 7.32 KB | None | 0 0
  1. package university.projects.ioimov6laba
  2.  
  3. import android.support.v7.app.AppCompatActivity
  4. import android.os.Bundle
  5. import android.util.Log
  6. import java.lang.Math.sqrt
  7. import kotlin.math.abs
  8. import kotlin.math.pow
  9. import kotlin.math.sqrt
  10.  
  11. class MainActivity : AppCompatActivity() {
  12.  
  13.     //step 1
  14.     private val l = 0.01
  15.     private val e = 0.001
  16.     private val Ъ = 0.001
  17.     private var k = 0
  18.     private var lk = 0.1
  19.     private var a: MutableList<Double> = mutableListOf()
  20.     private var b: MutableList<Double> = mutableListOf()
  21.     private var yk: MutableList<Double> = mutableListOf()
  22.     private var zk: MutableList<Double> = mutableListOf()
  23.     private var x: MutableList<Double> = mutableListOf()
  24.     private var deltaX = 1
  25.  
  26.     private fun init() {
  27.         k = 0
  28.         lk = 0.1
  29.         a = mutableListOf()
  30.         b = mutableListOf()
  31.         yk = mutableListOf()
  32.         zk = mutableListOf()
  33.         x = mutableListOf()
  34.     }
  35.  
  36.     override fun onCreate(savedInstanceState: Bundle?) {
  37.         super.onCreate(savedInstanceState)
  38.         setContentView(R.layout.activity_main)
  39.  
  40.         val goldenSectionMethodSolution = goldenSectionMethod()
  41.         val halfDivisionSolution = halfDivision()
  42.         val polynomialSolution = polynomialApproximation()
  43.         val newton = newton()
  44.         val bolzman = bolzman()
  45.         hashCode()
  46.     }
  47.  
  48.     private fun bolzman(): Double {
  49.         fun getZk(ak: Double, bk: Double): Double {
  50.             return (ak + bk) / 2
  51.         }
  52.  
  53.         fun derivativeFx(x: Double): Double {
  54.             return 4 * x.pow(3) - 30 * x.pow(2) + 72 * x + 5
  55.         }
  56.         init()
  57.         k = 0
  58.         a.add(3.0)
  59.         b.add(5.0)
  60.         do {
  61.             val zk = getZk(a[k], b[k])
  62.             this.zk.add(zk)
  63.             val derivativeFzk = derivativeFx(this.zk[k])
  64.             if (derivativeFzk < 0) {
  65.                 a.add(this.zk[k])
  66.                 b.add(b[k])
  67.             } else if (derivativeFzk > 0) {
  68.                 a.add(a[k])
  69.                 b.add(this.zk[k])
  70.             }
  71.             if (Math.abs(derivativeFzk) <= e + a[0]) {
  72.                 return this.zk[k]
  73.             }
  74.             if(b[k] == a[0]){
  75.                 return this.zk[k]
  76.             }
  77.             k++
  78.             Log.e("bolzman", b.toString())
  79.         }while (Math.abs(derivativeFx(this.zk.last())) > e)
  80.  
  81.         return 0.0
  82.     }
  83.  
  84.     private fun f(x: Double): Double {
  85.         return x.pow(4) - 10 * x.pow(3) + 36 * x.pow(2) + 5 * x
  86.     }
  87.  
  88.     private fun newton(): Double {
  89.         fun derivativeFx(x: Double): Double {
  90.             return 4 * x.pow(3) - 30 * x.pow(2) + 72 * x + 5
  91.         }
  92.  
  93.         fun doubleDerivativeFx(x: Double): Double {
  94.             return 12 * x.pow(2) - 60 * x + 72
  95.         }
  96.  
  97.         init()
  98.         var n = 0
  99.         x.add(0.0)
  100.  
  101.         var o: Double
  102.  
  103.         do {
  104.             val xnplusone = x[n] - (derivativeFx(x[n]) / doubleDerivativeFx(x[n]))
  105.             x.add(xnplusone)
  106.  
  107.             if (Math.abs(derivativeFx(x[n + 1])) <= e) {
  108.                 if (x[n + 1] < x[0])
  109.                     return 3.0
  110.             } else {
  111.                 n++
  112.             }
  113.         } while (Math.abs(derivativeFx(x.last())) > e)
  114.  
  115.         return 0.0
  116.     }
  117.  
  118.     private fun polynomialApproximation(): Double {
  119.         fun findA1(x2: Double, x1: Double): Double {
  120.             return (f(x2) - f(x1)) / (x2 - x1)
  121.         }
  122.  
  123.         fun findA2(): Double {
  124.             return (1 / (x[2] - x[1])) * (findA1(x[2], x[0]) - findA1(x[1], x[0]))
  125.         }
  126.  
  127.         fun findNotX(a1: Double, a2: Double): Double {
  128.             return ((x[1] + x[0]) / 2) - (a1 / (2 * a2))
  129.         }
  130.         init()
  131.         var firstCheck: Boolean
  132.         var secondCheck: Boolean
  133.         x.add(0.0)
  134.         val t = mutableListOf<Double>()
  135.  
  136.         x.add(x[0] + deltaX)
  137.         val fx1 = f(x[0])
  138.         val fx2 = f(x[1])
  139.         if (fx1 > fx2) {
  140.             x.add(x[0] + 2 * deltaX)
  141.         } else {
  142.             x.add(x[0] - deltaX)
  143.         }
  144.  
  145.         if (x[2] < x[0]) {
  146.             val x1 = x[0]
  147.             val x2 = x[1]
  148.             val x3 = x[2]
  149.             x[0] = x3
  150.             x[1] = x1
  151.             x[2] = x2
  152.         }
  153.  
  154.         do {
  155.             val fMin = x.map { x -> f(x) }.min()
  156.             val xMin = x[x.map { x -> f(x) }.indexOf(fMin)]
  157.             val a1 = findA1(x[1], x[0])
  158.             val a2 = findA2()
  159.             val notX = findNotX(a1, a2)
  160.  
  161.             firstCheck = (Math.abs(fMin!! - f(notX)) <= e)
  162.             secondCheck = Math.abs(xMin - notX) <= Ъ
  163.  
  164.             if (firstCheck && secondCheck) {
  165.  
  166.                 return if (notX <3.0){
  167.                     3.0
  168.                 } else{
  169.                     notX
  170.                 }
  171.             } else {
  172.                 val best = if (f(notX) < fMin) {
  173.                     notX
  174.                 } else {
  175.                     xMin
  176.                 }
  177.                 t.addAll(x)
  178.                 t.add(notX)
  179.                 t.add(best)
  180.                 t.sort()
  181.                 val index = t.indexOf(best)
  182.  
  183.                 x[0] = t.first { x -> x < best }
  184.                 x[1] = best
  185.                 x[2] = t.first { x -> x > best }
  186.  
  187.             }
  188.         } while (!(firstCheck && secondCheck))
  189.         return 0.0
  190.     }
  191.  
  192.     private fun halfDivision(): Double {
  193.         fun findYk(k: Int): Double {
  194.             return (a[k] + b[k] - e) / 2
  195.         }
  196.  
  197.         fun findZk(k: Int): Double {
  198.             return (a[k] + b[k] + e) / 2
  199.         }
  200.         init()
  201.  
  202.         a.add(3.0)
  203.         b.add(5.0)
  204.         k = 0
  205.         while (lk > l) {
  206.             yk.add(findYk(k))
  207.             zk.add(findZk(k))
  208.  
  209.             val fyk = f(yk[k])
  210.             val fzk = f(zk[k])
  211.  
  212.             if (fyk <= fzk) {
  213.                 a.add(a[k])
  214.                 b.add(zk[k])
  215.             } else {
  216.                 a.add(yk[k])
  217.                 b.add(b[k])
  218.             }
  219.             lk = Math.abs(b[k + 1] - a[k + 1])
  220.             if (lk <= l) {
  221.                 return (a[k + 1] + b[k + 1]) / 2
  222.             } else {
  223.                 k += 1
  224.             }
  225.         }
  226.         return 0.0
  227.     }
  228.  
  229.     private fun goldenSectionMethod(): Double {
  230.         fun findYk(k: Int): Double {
  231.             return a[k] + ((3 - sqrt(5.0)) / 2) * (b[k] - a[k])
  232.         }
  233.  
  234.         fun findZk(y0: Double, k: Int): Double {
  235.             return a[k] + b[k] - y0
  236.         }
  237.  
  238.         init()
  239.  
  240.         a.add(3.0)
  241.         b.add(5.0)
  242.  
  243.         //step 3
  244.         val yk = findYk(k)
  245.         this.yk.add(yk)
  246.         val zk = findZk(yk, k)
  247.         this.zk.add(zk)
  248.         //step 4
  249.         while (lk > l) {
  250.             val fyk = f(this.yk[k])
  251.             val fzk = f(this.zk[k])
  252.             //step 5
  253.             if (fyk <= fzk) {
  254.                 a.add(a[k])
  255.                 b.add(this.zk[k])
  256.                 this.yk.add(findZk(this.yk[k], k + 1))
  257.                 this.zk.add(this.yk[k])
  258.             } else {
  259.                 a.add(this.yk[k])
  260.                 b.add(b[k])
  261.                 this.yk.add(zk)
  262.                 this.zk.add(findZk(zk, k + 1))
  263.             }
  264.             //step 6
  265.             lk = abs(b[k + 1] - a[k + 1])
  266.             if (lk <= l) {
  267.                 return (a[k + 1] + b[k + 1]) / 2
  268.             } else {
  269.                 k += 1
  270.                 Log.e("continue", k.toString())
  271.             }
  272.         }
  273.  
  274.         return 0.0
  275.     }
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement