def plot_fehl(plotber, r_s_arr, ex_lsg_arr, matr_type, dim=1): """ Plottet den Fehler der numerischen Loesung im Vergleich zur exakten Loesung. Input: plotber (axis-Objekt): Plotbereich, in den geplottet werden soll r_s_arr (list oder array aus numpy.ndarrays): Liste aus rechten Seiten. ex_lsg_arr (list oder array aus numpy.ndarrays): Liste aus entsprechenden exakten Loesungen. matr_type (string): Bestimmt die Matrixart, die untersucht wird. Moeglichkeiten: Hilbertmatrix ("hil") oder Bandmatrix fuer d=1,2,3 ("a"). dim (int, Standard: 1): Wird nur fuer die Bandmatrizen benoetigt und gibt deren Dimension an. """ # Die Matrixgroesse ergibt sich direkt aus den Vektoren: m_arr = np.vectorize(len)(r_s_arr) if matr_type == "hil": # Berechnung und Plotten des Fehlers: fehl_hil_arr = np.zeros(len(r_s_arr)) for ind, r_s in enumerate(r_s_arr): hil_matr = Hilbert(len(r_s)) lsg = hil_matr.lgs_lsg(r_s) fehl_hil_arr[ind] = lina.norm(lsg - ex_lsg_arr[ind], ord=np.inf) plotber.loglog(m_arr, fehl_hil_arr, "o", markerfacecolor="None", markersize=groess) elif matr_type == "a": # Berechnung und Plotten des Fehlers: fehl_a_matr = np.zeros(len(r_s_arr)) for ind, r_s in enumerate(r_s_arr): # Berechnung von n und des Fehlers: n_wert = len(r_s_arr[ind])**(1 / dim) + 1 a_matr = Sparse(dim, n_wert) lsg = a_matr.lgs_lsg(r_s) fehl_a_matr[ind] = lina.norm(lsg - ex_lsg_arr[ind], ord=np.inf) plotber.loglog(m_arr, fehl_a_matr, "o", markerfacecolor="None") else: # Falls eine inkorrekte Eingabe fuer matr_type erfolgte: raise ValueError( "Bitte uebergeben Sie einen gueltigen Matrixtyp (\"hil\" " + "fuer Hilbert-Matrizen und" + " \"a\" fuer die Bandmatrizen)!")
def plot_res(plotber, r_s_arr, matr_type, dim=1): """ Plottet das Resiuduum. Input: plotber (axis-Objekt): Plotbereich, in den geplottet werden soll r_s_arr (list oder array aus numpy.ndarrays): Liste aus rechten Seiten. matr_type (string): Bestimmt die Matrixart, die untersucht wird. Moeglichkeiten: Hilbertmatrix ("hil") oder Bandmatrix fuer d=1,2,3 ("a"). dim (int, Standard: 1): Wird nur fuer die Bandmatrizen benoetigt und gibt deren Dimension an. """ # Matrixgroesse ergibt sich direkt aus den Vektoren: m_arr = np.vectorize(len)(r_s_arr) if matr_type == "hil": # Berechnung und Plotten des Residuums: res_hil_arr = np.zeros(len(r_s_arr)) for ind, r_s in enumerate(r_s_arr): hil_matr = Hilbert(len(r_s)) matr = hil_matr.return_hil_matr() lsg = hil_matr.lgs_lsg(r_s) res_hil_arr[ind] = lina.norm(matr * lsg - r_s, ord=np.inf) plotber.loglog(m_arr, res_hil_arr, "o", markerfacecolor="None") elif matr_type == "a": # Berechnung und Plotten des Residuums: res_a_matr = np.zeros(len(r_s_arr)) for ind, r_s in enumerate(r_s_arr): n_wert = len(r_s_arr[ind])**(1 / dim) + 1 a_matr = Sparse(dim, n_wert) lsg = a_matr.lgs_lsg(r_s) matr = a_matr.return_mat_d_csc() res_a_matr[ind] = lina.norm(matr * lsg - r_s, ord=np.inf) plotber.loglog(m_arr, res_a_matr, "o", markerfacecolor="None") else: # Falls eine inkorrekte Eingabe fuer matr_type erfolgte: raise ValueError( "Bitte uebergeben Sie einen gueltigen Matrixtyp (\"hil\" " + "fuer Hilbert-Matrizen und" + " \"a\" fuer die Bandmatrizen)!")
def loesg(numb, dims, fkt, ulsg=fntn): """ Diese Methode dient zur Lösung der Differentialgleichung und zum Vergleichen der exakten und approximierten Lösungen. Input: numb (int): Feinheit der Diskretisierung. dims (int): Dimension der Diskretisierung. fkt (Funktion): Die gegebene Funktion f aus der Aufgabestellung. ulsg (Funktion): Die exakte Lösung der Differentialgleichung. Return: (float): Der absolute Fehler in der approximierten Lösung der Differentialgleichung. """ # Erstellung des Vektors b arra = gitter(numb, dims) arrb = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrb[i] = fkt(arra[i]) / (numb**2) # Erstellung und Lösen der Bandmatrix mata = Sparse(dims, numb) lsg = mata.lgs_lsg(arrb) # Erstellung des Vektors der exakten Lösung arrex = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrex[i] = ulsg(arra[i]) # Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) # Graphische Ausgabe: if dims == 2: # Plot der berechneten Lösung plot_disc_fct( lsg, numb, "Berechnete Lösung mit Feinheit der Diskretisierung " + str(numb)) # Plot der Referenzlösung grd1 = np.linspace(0, 1, 1000) grd2 = np.linspace(0, 1, 1000) grd1, grd2 = np.meshgrid(grd1, grd2) arra2 = gitter(1001, 2) arrex2 = np.zeros(1000000) for i in range(1000000): arrex2[i] = ulsg(arra2[i]) grd3 = arrex2.reshape(1000, 1000) fig = plt.figure() fig.suptitle("Die Referenzlösung") axis = Axes3D(fig) axis.plot_surface(grd1, grd2, grd3, cmap=cm.coolwarm) axis.view_init(20, -105) # Plot des Fehlers plot_disc_fct( arrf, numb, "Fehler bezüglich der Referenzlösung mit" + " Feinheit der Diskretisierung " + str(numb)) print("Der maximale Fehler ist " + str(np.amax(arrf))) plt.show()
def loesg(dims, fkt, ulsg): """ Diese Methode dient zur Lösung der Differentialgleichung und zum Vergleichen der exakten und approxmierten Lösungen. Input: dims (int): Dimension der Diskretisierung fkt (Funktion): Die gegebene Funktion f aus der Aufgabestellung ulsg (Funktion): Die exakte Lösung der Differentialgleichung Return: (float): Der absolute Fehler in der approximierten Lösung der Differentialgleichung """ #Plotten von dem Konvergenzverfahren, Dimension 1 if dims == 1: arrn = np.arange(4, 1004, 20) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrb[i] = fkt(arra[i])/(k**2) #Erstellung und Lösen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Lösung arrex = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrf[i] = np.abs(arrex[i]-lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.plot(arrn, arrfa) plt.title("Konvergenzverhalten der numerischen Loesung in Dimension 1") plt.xlabel("Feinheit der Diskretisierung") plt.ylabel("Absoluter Fehler") #Plotten von dem Konvergenzverfahren, Dimension 2 if dims == 2: arrn = np.arange(5, 95, 5) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrb[i] = fkt(arra[i])/(k**2) #Erstellung und Lösen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Lösung arrex = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrf[i] = np.abs(arrex[i]-lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.plot(arrn, arrfa) plt.title("Konvergenzverhalten der numerischen Loesung in Dimension 2") plt.xlabel("Feinheit der Diskretisierung") plt.ylabel("Absoluter Fehler") #Plotten von dem Konvergenzverfahren, Dimension 3 if dims == 3: arrn = np.arange(3, 23, 2) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrb[i] = fkt(arra[i])/(k**2) #Erstellung und Lösen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Lösung arrex = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrf[i] = np.abs(arrex[i]-lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.plot(arrn, arrfa) plt.title("Konvergenzverhalten der numerischen Loesung in Dimension 3") plt.xlabel("Feinheit der Diskretisierung") plt.ylabel("Absoluter Fehler") #Grafische Ausgabe if dims == 2: for k in [7, 27]: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrb[i] = fkt(arra[i])/(k**2) #Erstellung und Lösen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Lösung arrex = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((k-1)**dims) for i in range((k-1)**dims): arrf[i] = np.abs(arrex[i]-lsg[i]) #Plot der berechneten Lösung plot_disc_fct(lsg, k, "Berechnete Loesung mit Feinheit der Diskretisierung "+str(k)) #Plot des Fehlers plot_disc_fct(arrf, k, "Fehler bezueglich der Referenzloesung mit" +" Feinheit der Diskretisierung "+str(k)) #Plot der Referenzlösung grd1 = np.linspace(0, 1, 1000) grd2 = np.linspace(0, 1, 1000) grd1, grd2 = np.meshgrid(grd1, grd2) arra2 = gitter(1001, 2) arrex2 = np.zeros(1000000) for i in range(1000000): arrex2[i] = ulsg(arra2[i]) grd3 = arrex2.reshape(1000, 1000) fig = plt.figure() fig.suptitle("Die Referenzloesung") axis = Axes3D(fig) axis.plot_surface(grd1, grd2, grd3, cmap=cm.coolwarm) axis.view_init(20, -105) plt.show() return np.amax(arrf)
def loesg(dims, numb, fkt, ulsg): """ Diese Methode dient zur Loesung der Differentialgleichung und zum Vergleichen der exakten und approxmierten Loesungen. Input: dims (int): Dimension der Diskretisierung numb (int): Feinheit der DiskretisierungS fkt (Funktion): Die gegebene Funktion f aus der Aufgabestellung ulsg (Funktion): Die exakte Loesung der Differentialgleichung Return: (float): Der absolute Fehler in der approximierten Loesung der Differentialgleichung """ #Grafik des Fehlers bezueglich des Iterationsschritts #CG Methode Loesung, Dimension 1 los0 = 0.001 * np.ones((numb - 1)**dims) #Erstellung des Vektors b arra = gitter(numb, dims) arrb = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrb[i] = fkt(arra[i]) / (numb**2) #Erstellung und Loesen der Bandmatrix durch die CG-Methode eps = 10**-14 mata = Sparse(dims, numb) los = mata.cg_meth(los0, arrb, eps) laeng = len(los) #Erstellung des Vektors der exakten Loesung arrex = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Loesung mit C-G-Verfahren maxfeh = np.zeros(laeng) for k in range(laeng): arrf = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrf[i] = np.abs(arrex[i] - los[k][i]) maxfeh[k] = np.amax(arrf) if k == laeng - 1: print(np.amax(arrf)) plt.semilogy(range(laeng), maxfeh) plt.title( "Konvergenzverhalten der Loesung mit der CG-Methode in Dimension " + str(dims) + " mit Feinheit der Diskretisierung " + str(numb) + " und mit Schranke " + str(eps)) plt.xlabel("Iterationsschritt") plt.ylabel("Absoluter Fehler") #plt.savefig("./Bericht/Bilder/IterDim"+str(dims), dpi=300) plt.show() #Erstellung und Loesen der Bandmatrix durch die L-U-Zerlegung mata = Sparse(dims, numb) lsg_lu = mata.lgs_lsg(arrb) #Erstellung des Vektors des Fehlers in der berechneten Loesung mit L-U-Zerlegung arrf = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg_lu[i]) print(np.amax(arrf)) #Grafik des Fehlers bezueglich Epsilon fehl = np.zeros(5) ind = 0 for k in [-2, 0, 2, 4, 6]: eps = numb**(-k) los0 = 0.001 * np.ones((numb - 1)**dims) mata = Sparse(dims, numb) los = mata.cg_meth(los0, arrb, eps) laeng = len(los) lsg = los[laeng - 1] arrf = np.zeros((numb - 1)**dims) for i in range((numb - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) fehl[ind] = np.amax(arrf) ind = ind + 1 plt.loglog([numb**2, 1, numb**-2, numb**-4, numb**-6], fehl) plt.title( "Konvergenzverhalten der numerischen Loesung mit der CG-Methode in Dimension " + str(dims) + " und Feinheit der Diskretisierung " + str(numb)) plt.xlabel("Schranke (abhaengig von der Feinheit der Diskretisierung)") plt.ylabel("Absoluter Fehler") plt.show() #Grafik des Fehlers bezüglch der Fehlerschranke eps = np.logspace(-15, 1, 30) los0 = 0.001 * np.ones((numb - 1)**dims) graf = np.zeros(30) abbr = 0 for i in eps: mata = Sparse(dims, numb) los = mata.cg_meth(los0, arrb, i) laeng = len(los) arrf = np.zeros((numb - 1)**dims) for k in range((numb - 1)**dims): arrf[k] = np.abs(arrex[k] - los[laeng - 1][k]) graf[abbr] = np.amax(arrf) abbr = abbr + 1 plt.loglog(eps, graf) plt.title( "Konvergenzverhalten der numerischen Loesung mit der CG-Methode in Dimension " + str(dims) + " und Feinheit der Diskretisierung " + str(numb)) plt.xlabel("Schranke") plt.ylabel("Absoluter Fehler") plt.show() #Grafik des Fehlers bezüglich der Feinheit der Disretisierung if dims == 1: arrn = np.arange(4, 1004, 40) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrb[i] = fkt(arra[i]) / (k**2) #Erstellung und Loesen der Bandmatrix mit C-G-Verfahren los0 = 0.001 * np.ones((k - 1)**dims) eps = 10**-14 mata = Sparse(dims, k) los = mata.cg_meth(los0, arrb, eps) laeng = len(los) lsg = los[laeng - 1] #Erstellung des Vektors der exakten Loesung arrex = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Loesung arrf = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.semilogy(arrn, arrfa, 'b', label="Mit C-G-Verfahren") if dims == 2: arrn = np.arange(5, 95, 10) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrb[i] = fkt(arra[i]) / (k**2) #Erstellung und Lösen der Bandmatrix mit C-G-Verfahren los0 = 0.001 * np.ones((k - 1)**dims) eps = 10**-14 mata = Sparse(dims, k) los = mata.cg_meth(los0, arrb, eps) laeng = len(los) lsg = los[laeng - 1] #Erstellung des Vektors der exakten Lösung arrex = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.semilogy(arrn, arrfa, 'b', label="Mit C-G-Verfahren") if dims == 3: arrn = np.arange(3, 23, 4) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrb[i] = fkt(arra[i]) / (k**2) #Erstellung und Lösen der Bandmatrix mit C-G-Verfahren los0 = 0.001 * np.ones((k - 1)**dims) eps = 10**-14 mata = Sparse(dims, k) los = mata.cg_meth(los0, arrb, eps) laeng = len(los) lsg = los[laeng - 1] #Erstellung des Vektors der exakten Lösung arrex = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Lösung arrf = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.semilogy(arrn, arrfa, 'b', label="Mit C-G-Verfahren") #Plotten von dem Konvergenzverfahren, Dimension 1 if dims == 1: arrn = np.arange(4, 1004, 20) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrb[i] = fkt(arra[i]) / (k**2) #Erstellung und Loesen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Loesung arrex = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Loesung arrf = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.semilogy(arrn, arrfa, 'r', label="Mit L-U-Zerlegung") plt.title("Konvergenzverhalten in Dimension 1") plt.xlabel("Feinheit der Diskretisierung") plt.ylabel("Absoluter Fehler") #Plotten von dem Konvergenzverfahren, Dimension 2 if dims == 2: arrn = np.arange(5, 95, 5) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrb[i] = fkt(arra[i]) / (k**2) #Erstellung und Loesen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Loesung arrex = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Loesung arrf = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.plot(arrn, arrfa, 'r', label="Mit L-U-Zerlegung") plt.title("Konvergenzverhalten in Dimension 2") plt.xlabel("Feinheit der Diskretisierung") plt.ylabel("Absoluter Fehler") #Plotten von dem Konvergenzverfahren, Dimension 3 if dims == 3: arrn = np.arange(3, 23, 2) arrfa = np.zeros(len(arrn)) refe = 0 for k in arrn: #Erstellung des Vektors b arra = gitter(k, dims) arrb = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrb[i] = fkt(arra[i]) / (k**2) #Erstellung und Loesen der Bandmatrix mata = Sparse(dims, k) lsg = mata.lgs_lsg(arrb) #Erstellung des Vektors der exakten Loesung arrex = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrex[i] = ulsg(arra[i]) #Erstellung des Vektors des Fehlers in der berechneten Loesung arrf = np.zeros((k - 1)**dims) for i in range((k - 1)**dims): arrf[i] = np.abs(arrex[i] - lsg[i]) arrfa[refe] = np.amax(arrf) refe = refe + 1 plt.plot(arrn, arrfa, 'r', label="Mit L-U-Zerlegung") plt.title("Konvergenzverhalten in Dimension 3") plt.xlabel("Feinheit der Diskretisierung") plt.ylabel("Absoluter Fehler") plt.legend() plt.show() return np.amax(arrf)