Entries tagged bisection

Nullstellenberechnung in Lua

Posted on 16. Dezember 2013 Comments

Nachdem ich 2011 schonmal ein paar Methoden zur numerischen Nullstellenberechnung in MATLAB online gestellt hatte, hier nur dieselben Beispiele in Lua. Ich habe mit Lua gerade erst angefangen und eigentlich erstmal  zur Übung nur den Code übersetzt. Der Code ist natürlich auf GitHub. Eine gute Lua Referenz ist Learn Lua in 15 Minutes von @tylerneylon.

Wie im letzten Beispiel habe ich diese Funktion benutzt:

Ableitung zur Nullstellenberechnung Beipiel

Außer bei Newton(da braucht man noch die Ableitung) sieht das dann in Lua so aus.

function f(x)
  return x^6-x-1
end

Zusätzlich habe ich noch die Genauigkeit Eta global festgesetzt:

eta = 0.00001

Bisektion

function bisection(a,b)
  local i = 0

  if (f(b)*f(a)<0) then
    while (math.abs(b-a)>eta) do
      if (f((a+b)/2)*f(a)>0) then
        a = ((a+b)/2)
      else
        b = ((a+b)/2)
      end
      i = i + 1
    end
    return ((a+b)/2)
  end
end

Newtonverfahren

function newton(x)
  local i = 0
  local diff = 1
  while (diff>eta) do
    nullstelle = x
    t1, t2 = f(x)
    x = x - (t1/t2)
    i = i+1
    diff = math.abs(x-nullstelle)
  end
  return x
end

function f(x)
  return x^6-x-1, 6*x^5-1
end

Regula Falsi

function regula_falsi(a,b)
  local i = 0
  local diff = 1
  if (f(b)*f(a)<0) then
    nullstelle = a
     while (diff > eta) do
      x = (a*f(b)-b*f(a))/(f(b)-f(a));
      if (f(x)<0) then
        a = x
      else
        b = x
      end
      diff = math.abs(x-nullstelle)
      nullstelle = x
      i = i+1
    end
  end
  return nullstelle
end

Sekantenverfahren

function secant(a,b)
  local i = 0
  while(math.abs(b-a)>eta) do
    nullstelle = b
    b = b-f(b)*(b-a)/(f(b)-f(a))
    a = nullstelle
    i = i+1
  end
  return ((a+b)/2)
end