示例#1
0
def test_hs01():
    # Hock-Schittkowski problem 01 (box constrained)
    def func(p):
        y = np.empty(2)
        y[0] = 10.0 * (p[1] - p[0]*p[0])
        y[1] = 1.0 - p[0]
        return y

    def jacf(p):
        j = np.empty((2, 2))
        j[0, 0] = -20.0 * p[0]
        j[0, 1] = 10.0
        j[1, 0] = -1.0
        j[1, 1] = 0.0
        return j

    y = np.zeros(2)
    p0 = [-2.0, 1.0]
    pt = [ 1.0, 1.0]
    bc = [(None, None), (-1.5, None)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, cdiff=True, **OPTS)
    assert_array_almost_equal(p, pt)
示例#2
0
def test_hs21():
    # Hock-Schittkowski MODIFIED problem 21 (box constrained)
    def func(p):
        y = np.empty(2)
        y[0] = p[0] / 10.0
        y[1] = p[1]
        return y

    def jacf(p):
        j = np.empty((2, 2))
        j[0, 0] = 0.1
        j[0, 1] = 0.0
        j[1, 0] = 0.0
        j[1, 1] = 1.0
        return j

    y = np.zeros(2)
    p0 = [-1.0, -1.0]
    pt = [ 2.0,  0.0]
    bc = [(2.0, 50.0), (-50.0, 50.0)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, cdiff=True, **OPTS)
    assert_array_almost_equal(p, pt)
示例#3
0
def test_hs21():
    # Hock-Schittkowski MODIFIED problem 21 (box constrained)
    def func(p):
        y = np.empty(2)
        y[0] = p[0] / 10.0
        y[1] = p[1]
        return y

    def jacf(p):
        j = np.empty((2, 2))
        j[0, 0] = 0.1
        j[0, 1] = 0.0
        j[1, 0] = 0.0
        j[1, 1] = 1.0
        return j

    y = np.zeros(2)
    p0 = [-1.0, -1.0]
    pt = [2.0, 0.0]
    bc = [(2.0, 50.0), (-50.0, 50.0)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, cdiff=True, **OPTS)
    assert_array_almost_equal(p, pt)
示例#4
0
def test_hs01():
    # Hock-Schittkowski problem 01 (box constrained)
    def func(p):
        y = np.empty(2)
        y[0] = 10.0 * (p[1] - p[0] * p[0])
        y[1] = 1.0 - p[0]
        return y

    def jacf(p):
        j = np.empty((2, 2))
        j[0, 0] = -20.0 * p[0]
        j[0, 1] = 10.0
        j[1, 0] = -1.0
        j[1, 1] = 0.0
        return j

    y = np.zeros(2)
    p0 = [-2.0, 1.0]
    pt = [1.0, 1.0]
    bc = [(None, None), (-1.5, None)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, cdiff=True, **OPTS)
    assert_array_almost_equal(p, pt)
示例#5
0
def test_hatfldc():
    # Problem hatfldc (box constrained)
    def func(p):
        y = np.empty(4)
        y[0] = p[0] - 1.0
        for i in range(1, 3):
            y[i] = p[i-1] - sqrt(p[i])
        y[3] = p[3] - 1.0
        return y

    def jacf(p):
        j = np.empty((4, 4))
        j[0, 0] = 1.0
        j[0, 1] = 0.0
        j[0, 2] = 0.0
        j[0, 3] = 0.0
        j[1, 0] = 1.0
        j[1, 1] = -0.5 / sqrt(p[1])
        j[1, 2] = 0.0
        j[1, 3] = 0.0
        j[2, 0] = 0.0
        j[2, 1] = 1.0
        j[2, 2] = -0.5 / sqrt(p[2])
        j[2, 3] = 0.0
        j[3, 0] = 0.0
        j[3, 1] = 0.0
        j[3, 2] = 0.0
        j[3, 3] = 1.0
        return j

    y = np.zeros(4)
    p0 = [0.9, 0.9, 0.9, 0.9]
    pt = [1.0, 1.0, 1.0, 1.0]
    bc = [(0.0, 10.0), (0.0, 10.0), (0.0, 10.0), (0.0, 10.0)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, cdiff=True, **OPTS)
    assert_array_almost_equal(p, pt)
示例#6
0
def test_hatfldc():
    # Problem hatfldc (box constrained)
    def func(p):
        y = np.empty(4)
        y[0] = p[0] - 1.0
        for i in range(1, 3):
            y[i] = p[i - 1] - sqrt(p[i])
        y[3] = p[3] - 1.0
        return y

    def jacf(p):
        j = np.empty((4, 4))
        j[0, 0] = 1.0
        j[0, 1] = 0.0
        j[0, 2] = 0.0
        j[0, 3] = 0.0
        j[1, 0] = 1.0
        j[1, 1] = -0.5 / sqrt(p[1])
        j[1, 2] = 0.0
        j[1, 3] = 0.0
        j[2, 0] = 0.0
        j[2, 1] = 1.0
        j[2, 2] = -0.5 / sqrt(p[2])
        j[2, 3] = 0.0
        j[3, 0] = 0.0
        j[3, 1] = 0.0
        j[3, 2] = 0.0
        j[3, 3] = 1.0
        return j

    y = np.zeros(4)
    p0 = [0.9, 0.9, 0.9, 0.9]
    pt = [1.0, 1.0, 1.0, 1.0]
    bc = [(0.0, 10.0), (0.0, 10.0), (0.0, 10.0), (0.0, 10.0)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, **OPTS)
    assert_array_almost_equal(p, pt)
    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, cdiff=True, **OPTS)
    assert_array_almost_equal(p, pt)
示例#7
0
def test_combust():
    # Equilibrium combustion problem, constrained nonlinear equation from the
    # book by Floudas et al.
    R   = 10.0
    R5  = 0.193
    R6  = 4.10622*1e-4
    R7  = 5.45177*1e-4
    R8  = 4.4975*1e-7
    R9  = 3.40735*1e-5
    R10 = 9.615*1e-7

    def func(p):
        p0, p1, p2, p3, p4 = p
        y = np.empty(5)
        y[0] = p0 * p1 + p0 - 3.0 * p4
        y[1] = 2.0 * p0 * p1 + p0 + 3.0 * R10 * p1*p1 + p1 * p2*p2 + \
            R7 * p1 * p2 + R9 * p1 * p3 + R8 * p1 - R * p4
        y[2] = 2.0 * p1 * p2*p2 + R7 * p1 * p2 + 2.0 * R5 * p2*p2 + \
            R6 * p2 - 8.0*p4
        y[3] = R9 * p1 * p3 + 2.0 * p3*p3 - 4.0 * R * p4
        y[4] = p0 * p1 + p0 + R10 * p1*p1 + p1 * p2*p2 + \
            R7 * p1 * p2 + R9 * p1 * p3 + R8 * p1 + R5 * p2*p2 + \
            R6 * p2 + p3*p3 - 1.0
        return y

    def jacf(p):
        p0, p1, p2, p3, p4 = p
        j = np.empty((5, 5))
        j[0, 0] = p1 + 1.0
        j[0, 1] = p0
        j[0, 2] = 0.0
        j[0, 3] = 0.0
        j[0, 4] = -3.0
        j[1, 0] = 2.0 * p1 + 1.0
        j[1, 1] = 2.0 * p0 + 6.0 * R10 * p1 + p2*p2 + R7 * p2 + R9 * p3 + R8
        j[1, 2] = 2.0 * p1 * p2 + R7 * p1
        j[1, 3] = R9*p1
        j[1, 4] = -R
        j[2, 0] = 0.0
        j[2, 1] = 2.0 * p2*p2 + R7 * p2
        j[2, 2] = 4.0 * p1 * p2 + R7 * p1 + 4 * R5 * p2 + R6
        j[2, 3] = -8.0
        j[2, 4] = 0.0
        j[3, 0] = 0.0
        j[3, 1] = R9 * p3
        j[3, 2] = 0.0
        j[3, 3] = R9 * p1 + 4.0*p3
        j[3, 4] = -4.0 * R
        j[4, 0] = p1 + 1.0
        j[4, 1] = p0 + 2.0 * R10 * p1 + p2*p2 + R7 * p2 + R9 * p3 + R8
        j[4, 2] = 2.0 * p1 * p2 + R7 * p1 + 2.0 * R5 * p2 + R6
        j[4, 3] = R9 * p1 + 2.0 * p3
        j[4, 4] = 0
        return j

    y = np.zeros(5)
    p0 = [0.0010,  0.0010, 0.0010, 0.0010, 0.0010]
    pt = [0.0034, 31.3265, 0.0684, 0.8595, 0.0370]
    bc = [(0.001, 100), (0.001, 100), (0.001, 100), (0.001, 100), (0.001, 100)]

    p, pcov, info = levmar.levmar_bc(func, p0, y, bc, jacf=jacf,
                                     maxit=5000, **OPTS)
    assert_array_almost_equal(p, pt, decimal=1)
示例#8
0
import numpy as np
import levmar


np.random.seed(1234)


def gauss(p, x):
    return p[0] * np.exp(-4 * log(2) * ((x - p[1]) / p[2])**2) + p[3]


# Create input data
x_mea = np.linspace(-5, 5)
p_tru = [230, -0.4, 2.0, 0.1]
y_tru = gauss(p_tru, x_mea)
y_mea = y_tru + np.sqrt(y_tru) * np.random.randn(x_mea.size)

# Initial estimate
p_ini = [1.0, -3.0, 3.0, 1.0]
# Ensure the width is (0, Inf).
bc = [(None, None), (None, None), (1.0e-6, None), (-10.0, 10.0)]
# Run the fitting routine
p_opt, p_cov, info = levmar.levmar_bc(gauss, p_ini, y_mea, bc, args=(x_mea,))

# Print the result
print("Expected:")
print("  {0[0]:9f} {0[1]:9f} {0[2]:9f}".format(p_tru))
print("Estimate:")
print("  {0[0]:9f} {0[1]:9f} {0[2]:9f}".format(p_opt))
print("")
示例#9
0
def test_combust():
    # Equilibrium combustion problem, constrained nonlinear equation from the
    # book by Floudas et al.
    R = 10.0
    R5 = 0.193
    R6 = 4.10622 * 1e-4
    R7 = 5.45177 * 1e-4
    R8 = 4.4975 * 1e-7
    R9 = 3.40735 * 1e-5
    R10 = 9.615 * 1e-7

    def func(p):
        p0, p1, p2, p3, p4 = p
        y = np.empty(5)
        y[0] = p0 * p1 + p0 - 3.0 * p4
        y[1] = 2.0 * p0 * p1 + p0 + 3.0 * R10 * p1*p1 + p1 * p2*p2 + \
            R7 * p1 * p2 + R9 * p1 * p3 + R8 * p1 - R * p4
        y[2] = 2.0 * p1 * p2*p2 + R7 * p1 * p2 + 2.0 * R5 * p2*p2 + \
            R6 * p2 - 8.0*p4
        y[3] = R9 * p1 * p3 + 2.0 * p3 * p3 - 4.0 * R * p4
        y[4] = p0 * p1 + p0 + R10 * p1*p1 + p1 * p2*p2 + \
            R7 * p1 * p2 + R9 * p1 * p3 + R8 * p1 + R5 * p2*p2 + \
            R6 * p2 + p3*p3 - 1.0
        return y

    def jacf(p):
        p0, p1, p2, p3, p4 = p
        j = np.empty((5, 5))
        j[0, 0] = p1 + 1.0
        j[0, 1] = p0
        j[0, 2] = 0.0
        j[0, 3] = 0.0
        j[0, 4] = -3.0
        j[1, 0] = 2.0 * p1 + 1.0
        j[1, 1] = 2.0 * p0 + 6.0 * R10 * p1 + p2 * p2 + R7 * p2 + R9 * p3 + R8
        j[1, 2] = 2.0 * p1 * p2 + R7 * p1
        j[1, 3] = R9 * p1
        j[1, 4] = -R
        j[2, 0] = 0.0
        j[2, 1] = 2.0 * p2 * p2 + R7 * p2
        j[2, 2] = 4.0 * p1 * p2 + R7 * p1 + 4 * R5 * p2 + R6
        j[2, 3] = -8.0
        j[2, 4] = 0.0
        j[3, 0] = 0.0
        j[3, 1] = R9 * p3
        j[3, 2] = 0.0
        j[3, 3] = R9 * p1 + 4.0 * p3
        j[3, 4] = -4.0 * R
        j[4, 0] = p1 + 1.0
        j[4, 1] = p0 + 2.0 * R10 * p1 + p2 * p2 + R7 * p2 + R9 * p3 + R8
        j[4, 2] = 2.0 * p1 * p2 + R7 * p1 + 2.0 * R5 * p2 + R6
        j[4, 3] = R9 * p1 + 2.0 * p3
        j[4, 4] = 0
        return j

    y = np.zeros(5)
    p0 = [0.0010, 0.0010, 0.0010, 0.0010, 0.0010]
    pt = [0.0034, 31.3265, 0.0684, 0.8595, 0.0370]
    bc = [(0.001, 100), (0.001, 100), (0.001, 100), (0.001, 100), (0.001, 100)]

    p, pcov, info = levmar.levmar_bc(func,
                                     p0,
                                     y,
                                     bc,
                                     jacf=jacf,
                                     maxit=5000,
                                     **OPTS)
    assert_array_almost_equal(p, pt, decimal=1)