Ejemplo n.º 1
0
def fvect(phi, ez, s):
    r3 = r(phi, ez)**3.0
    omega = Quaternion([0, Nb * r3 * cos(phi), Nb * r3 * sin(phi), 0])
    ans = lamCircle(phi) * omega - Quaternion([2.0, 0, 0, 0]) * dlamCircle(phi)

    ans = ans * Quaternion([Nk(phi, s + 1, ez), 0, 0, 0])
    return ans
Ejemplo n.º 2
0
def genSol(e, M):
    K = [[Quaternion([0, 0, 0, 0]) for _ in range(M)] for _ in range(M)]
    # print("K =", K)

    f = [Quaternion([0, 0, 0, 0]) for _ in range(M)]
    # print("f =", f)

    for s in range(M):
        phis = (s + 1) * T / (M + 1)
        #         phis = (s+1) * T/M
        # print("phis", phis)
        for k in range(M):
            # pointwise collocation
            K[s][k] = Kvect(phis, e, s, k)
            # print("K[{0}, {1}] = {2}".format(s, k, K[s][k]))

        f[s] = [fvect(phis, e, s)]
        # print("f[", s, "] =", f[s])
    # print("f =", f)

    aGauss = solveLinear(K, f)
    # for idx, elem in enumerate(aGauss):
    #     print("aGauss[{0}] = {1}".format(idx, list(map(str, elem))))
    a = deepcopy(aGauss[0])
    # print("a =", list(map(str,a)))
    return a
Ejemplo n.º 3
0
def eqEllipse(lam, phi, ez):
    #print("lam =", lam)
    lam = Quaternion(lam)
    r3 = r(phi, ez)**3.0
    omega = Quaternion([0, Nb * r3 * cos(phi), Nb * r3 * sin(phi), 0])
    ans = lam * omega
    ans = ans * Quaternion([0.5, 0, 0, 0])
    return [ans[idx] for idx in range(4)]
def fvect(phi, s, idx):
    assert (0 <= idx < 4)
    # print("s = ", s, "idx = ", idx)
    r3 = r(phi)**3.0
    omega = Quaternion([0, Nb * r3, 0, 1.0])
    ans = lam0 * omega * Quaternion([Nk(phi, s + 1), 0, 0, 0])
    # print(ans[idx])
    return ans[idx]
def dlamCircle(phi):
    omega = Quaternion([0, Nb, 0, 1.0])
    om = (1 + Nb * Nb)**0.5
    omega = omega * Quaternion([0.5 * cos(0.5 * om * phi), 0, 0, 0])
    ans = Quaternion([-0.5 * om * sin(0.5 * om * phi), 0, 0, 0])
    ans = ans + omega
    ans = lam0 * ans
    # ans = Quaternion([0, 0, 0, 0])
    return ans
Ejemplo n.º 6
0
def Kvect(phi, ez, s, k):
    # k+1 or k?
    ans = Quaternion([2 * dNk(phi, k + 1, ez), 0, 0, 0])

    r3 = r(phi, ez)**3.0
    omega = Quaternion([0, Nb * r3 * cos(phi), Nb * r3 * sin(phi), 0])

    ans = ans - omega * Quaternion([Nk(phi, k + 1, ez), 0, 0, 0])
    ans = ans * Quaternion([Nk(phi, s + 1, ez), 0, 0, 0])
    return ans
def fvect(phi, ez, s):
    r3 = r(phi, ez)**3.0
    omega = Quaternion([0, Nb * r3, 0, 1.0])
    ans = lamCircle(phi) * omega - Quaternion([2.0, 0, 0, 0]) * dlamCircle(phi)

    ans = ans * Quaternion([Nk(phi, s + 1, ez), 0, 0, 0])
    # short formula from paper
    short = lamCircle(phi) * Quaternion([0, Nb * (r3 - 1.0), 0, 0])
    short = short * Quaternion([Nk(phi, s + 1, ez), 0, 0, 0])
    # print("ans -- short", ans[idx], short[idx], abs(ans[idx] - short[idx]))
    return short
def Kvect(phi, s, k, idx):
    assert (0 <= idx < 4)
    # print("s = ", s, "idx = ", idx)

    # k -> k+1 the same mistake as in circle0
    # N=1, ||lam(T)||: 0.075 -> 0.997
    ans = Quaternion([2 * dNk(phi, k + 1), 0, 0, 0])

    r3 = r(phi)**3.0
    omega = Quaternion([0, Nb * r3, 0, 1.0])

    ans = ans - omega * Quaternion([Nk(phi, k + 1), 0, 0, 0])
    ans = ans * Quaternion([Nk(phi, s + 1), 0, 0, 0])
    # print(ans[idx])
    return ans[idx]
Ejemplo n.º 9
0
def genError(finish, de):
    res = []
    out = open("res/BASE{0}_big.dat".format(BASE), "w")
    outL = open("res/BASE_Latex{0}_big.dat".format(BASE), "w")
    mx = None
    print("T =", T)
    out.write("T = {0}".format(T))
    # Mmin, Mmax = (2, 9)
    # for m in range (Mmin, Mmax):
    #     out.write(" {0}".format(m))
    # out.write("\n")
    # for m in range (Mmin, Mmax):
    #     outL.write(" {0}".format(m))
    # outL.write("\n")

    for e in np.arange(0, finish + de / 2, de):
        print(e)
        out.write("\n{0:.2f}".format(e))
        outL.write("\n${0:.2f}$".format(e))
        for M in range(Mmin, Mmax):
            print("M =", M)
            a = genSol(e, M)
            # print(a)
            phi = np.linspace(0, T, 1001)
            sol = odeint(eqEllipse, [lam0[idx] for idx in range(4)],
                         phi,
                         args=(e, ),
                         rtol=1e-15)
            err = []
            for cur in zip(phi, sol):
                l = lam(a, cur[0], e)
                # l = l * Quaternion([1/l.getNorm()**0.5, 0, 0, 0])
                diff = Quaternion(cur[1]) - l
                err.append(diff.getNorm()**.5)
            mx = max(err)
            print(mx)
            # out.write(" {0:.20f}".format(mx))
            out.write(" {0:.1e}".format(mx))
            latex = " & ${0:.1e}".format(mx) + "}$"
            latex = latex.replace("e-0", " \cdot 10^{-")
            outL.write(latex)
        outL.write("\\\\[0.25em]\n\\hline\n%")
        res.append(mx)
        print()
    out.close()
    outL.close()
    print(res)
Ejemplo n.º 10
0
def lam(a, phi, ez):
    ans = lamCircle(phi)
    for k in range(len(a)):
        # print("ak", a[k])
        # Nkq = Quaternion([Nk(phi, k+1), 0, 0, 0])
        # print("Nkq", Nkq)
        # mul = a[k] * Nkq
        # print("mul", mul)
        ans = ans + a[k] * Quaternion([Nk(phi, k + 1, ez), 0, 0, 0])
    return ans
Ejemplo n.º 11
0
def genGraph(finish, de, m):
    out = open("res/BASE_Graph{0}_M{1}_big.dat".format(BASE, m), "w")
    # for _ in range(5):
    #     out.write(" {0}".format(0))
    for e in np.arange(0, finish + de / 2, de):
        print(e)
        out.write("\n{0:.2f}".format(e))
        print("M =", m)
        a = genSol(e, m)
        # print(a)
        phi = np.linspace(0, T, 1001)
        sol = odeint(eqEllipse, [lam0[idx] for idx in range(4)],
                     phi,
                     args=(e, ),
                     rtol=1e-15)
        err = []
        mx, norm = Quaternion([-1, -1, -1, -1]), -1
        for cur in zip(phi, sol):
            l = lam(a, cur[0], e)
            # l = l * Quaternion([1/l.getNorm()**0.5, 0, 0, 0])
            diff = Quaternion(cur[1]) - l
            # print(diff)
            ndiff = diff.getNorm()**.5
            if ndiff > norm:
                mx = diff
                norm = ndiff
        for idx in range(4):
            out.write(" {0}".format(abs(mx[idx])))
        out.write(" {0:.1e}".format(Quaternion(mx).getNorm()**.5))
        print(Quaternion(mx).getNorm()**.5)
    print()
    out.close()
Ejemplo n.º 12
0
    return (x, err)


if __name__ == "__main__":
    print("Gauss >>>")
    a = np.array([[1, 2], [3, 4]])
    print("a =", a)

    b = np.array([[1], [1]])
    print("b =", b)

    x = np.dot(np.linalg.inv(a), b)
    print("x =", x)

    aQ = [
        list(Quaternion([0.2 * i + 0.8 * j + 1, 0, 0, 0]) for j in range(2))
        for i in range(2)
    ]
    aQ[0].append(Quaternion([1, 0, 0, 0]))
    aQ[1].append(Quaternion([-2, 0, 0, 0]))

    print("aQ =")
    printQuatMatr(aQ)

    #     If the list contains objects and you want to copy them as well,
    #     use generic copy.deepcopy()
    aQtr = makeTriangle(deepcopy(aQ))
    print("aQtr =")
    printQuatMatr(aQtr)

    x = getSolution(aQtr)
Ejemplo n.º 13
0
def dlamCircle(phi):
    ans = Quaternion([0, 0, 0, 0])
    return ans
Ejemplo n.º 14
0
    Lambda big eq. No circle.
"""
from math import sin, cos, pi
import numpy as np
from MathematicModels import Quaternion
from Gauss import solveLinear
from copy import deepcopy
from scipy.integrate import quad, odeint, ode
import matplotlib.pyplot as plt

EZ = 0.1
T = pi / 2
M = 8
# lam0 = Quaternion([1, 0, 0, 0])
# lam0 = Quaternion([0.8, 0, 0.6, 0])
lam0 = Quaternion([1, 2, 3, 4])
lam0 = Quaternion([-0.235019, -0.144020, 0.502258, 0.819610])  #  GLONASS
lam0 = lam0 * Quaternion([1.0 / lam0.getNorm()**0.5, 0, 0, 0])
Nb = 0.35

BASE = 0


def lamCircle(phi):
    ans = lam0
    return ans


def dlamCircle(phi):
    ans = Quaternion([0, 0, 0, 0])
    return ans
from math import sin, cos, pi

import numpy as np
from MathematicModels import Quaternion
from scipy.integrate import quad

ez = 0.1
T = 0.1
N = 1
# lam0 = Quaternion([1, 0, 0, 0])
# lam0 = Quaternion([0.8, 0, 0.6, 0])
lam0 = Quaternion([1, 2, 3, 4]) * Quaternion([1 / (30.0)**0.5, 0, 0, 0])
Nb = 0.35


def r(phi):
    return 1.0 / (1.0 + ez * cos(phi))


def Nk(phi, k):
    # return phi ** k
    return sin((pi * k * phi) / (2 * T))


def dNk(phi, k):
    # return k * (phi ** (k-1))
    return ((pi * k) / (2 * T)) * cos((pi * k * phi) / (2 * T))


def lam(a, phi):
    ans = lam0