From c07d13fe4f902600949cd48f2d542c509fbebf9f Mon Sep 17 00:00:00 2001
From: Lucas Christesen Ahler <201907296@post.au.dk>
Date: Wed, 23 Jun 2021 13:46:47 +0200
Subject: [PATCH] root-finding homework

---
 homework/root-finding/Makefile          |  70 +++++++
 homework/root-finding/func.png          | Bin 0 -> 6772 bytes
 homework/root-finding/functions.c       | 249 ++++++++++++++++++++++++
 homework/root-finding/functions.h       |  33 ++++
 homework/root-finding/improved_wave.png | Bin 0 -> 7944 bytes
 homework/root-finding/main.c            |  75 +++++++
 homework/root-finding/out.txt           |  58 ++++++
 homework/root-finding/simple_wave.png   | Bin 0 -> 8631 bytes
 8 files changed, 485 insertions(+)
 create mode 100755 homework/root-finding/Makefile
 create mode 100644 homework/root-finding/func.png
 create mode 100755 homework/root-finding/functions.c
 create mode 100755 homework/root-finding/functions.h
 create mode 100644 homework/root-finding/improved_wave.png
 create mode 100755 homework/root-finding/main.c
 create mode 100644 homework/root-finding/out.txt
 create mode 100644 homework/root-finding/simple_wave.png

diff --git a/homework/root-finding/Makefile b/homework/root-finding/Makefile
new file mode 100755
index 0000000..5eeaabc
--- /dev/null
+++ b/homework/root-finding/Makefile
@@ -0,0 +1,70 @@
+CFLAGS = -Wall -O3 -std=gnu11 $(shell gsl-config --cflags)
+LDLIBS = -lm $(shell gsl-config --libs)
+
+default: simple_wave.png improved_wave.png func.png
+
+simple_wave.png: paths exact.txt Makefile
+	echo '\
+	set terminal png;\
+	set output "$@";\
+	set key top right;\
+	set tics out;\
+	set yrange [0:0.4];\
+	set grid;\
+	set xlabel "r (Bohr radius)";\
+	set ylabel "f(r)";\
+	set title "Shooting method with simple boundary condition";\
+	plot\
+	"simplepath2.txt" using 1:2 with line title "rmax = 2",\
+	"simplepath4.txt" using 1:2 with line title "rmax = 4",\
+	"simplepath6.txt" using 1:2 with line title "rmax = 6",\
+	"simplepath8.txt" using 1:2 with line title "rmax = 8",\
+	"simplepath10.txt" using 1:2 with line title "rmax = 10",\
+	"exact.txt" using 1:2 with line title "exact solution",\
+	' | gnuplot
+
+improved_wave.png: paths exact.txt Makefile
+	echo '\
+	set terminal png;\
+	set output "$@";\
+	set key top right;\
+	set tics out;\
+	set yrange [0:0.4];\
+	set grid;\
+	set xlabel "r (Bohr radius)";\
+	set ylabel "f(r)";\
+	set title "Shooting method with improved boundary condition";\
+	plot\
+	"improvedpath1.txt" using 1:2 with line title "rmax = 1",\
+	"improvedpath2.txt" using 1:2 with line title "rmax = 2",\
+	"improvedpath3.txt" using 1:2 with line title "rmax = 3",\
+	"improvedpath4.txt" using 1:2 with line title "rmax = 4",\
+	"exact.txt" using 1:2 with line title "exact solution",\
+	' | gnuplot
+
+func.png: Fe.txt Makefile
+	echo '\
+	set terminal png;\
+	set output "$@";\
+	set key top right;\
+	set tics out;\
+	set xlabel "Energy";\
+	set ylabel "Fe(rmax)";\
+	set title "Zoom on Fe to show instability of ODE";\
+	set xrange [-0.35:-0.32];\
+	set yrange [-4.6:-4.2];\
+	plot\
+	"Fe.txt" using 1:2 with line title "rmax=8",\
+	' | gnuplot
+
+paths exact.txt Fe.txt: main
+	./$< > out.txt
+	$(RM) N
+
+main: main.c functions.c
+
+
+.PHONEY: clean
+
+clean:
+	$(RM) main *.o *.txt *.png
\ No newline at end of file
diff --git a/homework/root-finding/func.png b/homework/root-finding/func.png
new file mode 100644
index 0000000000000000000000000000000000000000..c68e21e16175177fd8c646b0638142dee73cabf2
GIT binary patch
literal 6772
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
JRhR6;{tE{mt{eaW

literal 0
HcmV?d00001

diff --git a/homework/root-finding/functions.c b/homework/root-finding/functions.c
new file mode 100755
index 0000000..e836089
--- /dev/null
+++ b/homework/root-finding/functions.c
@@ -0,0 +1,249 @@
+#include "functions.h"
+
+static double E;
+void f(gsl_vector* x, gsl_vector* fx) {
+    double x0 =gsl_vector_get(x,0);
+    double x1 =gsl_vector_get(x,1);
+    gsl_vector_set(fx,0,400*pow(x0,3)-400*x0*x1+2*x0-2);
+    gsl_vector_set(fx,1,200*(x1-pow(x0,2)));
+}
+
+void radial(double r, gsl_vector* y, gsl_vector* dydr) {
+    double y0 = gsl_vector_get(y,0);
+    double y1 = gsl_vector_get(y,1);
+    gsl_vector_set(dydr,0,y1);
+    gsl_vector_set(dydr,1,2*(-1.0/r-E)*y0);
+}
+
+double Fe_simple(double energy, double rmax, char* save_path) {
+    double rmin = 1e-3;
+    gsl_vector* ya = gsl_vector_alloc(2);
+    gsl_vector* yb = gsl_vector_alloc(2);
+    gsl_vector_set(ya,0,rmin-rmin*rmin);
+    gsl_vector_set(ya,1,1.0-2*rmin);
+    E = energy;
+    //printf("%g\n",E);
+    int steps = driver(radial,rmin,ya,rmax,yb,0.1,1e-4,1e-4,save_path);
+    double result = gsl_vector_get(yb,0);
+    gsl_vector_free(ya);
+    gsl_vector_free(yb);
+    return result;
+}
+
+void print_vector(char s[], gsl_vector* v) {
+	printf("%s\n",s);
+	for(int i=0;i<v->size;i++) {
+		printf("%15g",gsl_vector_get(v,i));
+		printf("\n");
+	}
+}
+
+void print_matrix(gsl_matrix* M) {
+    for(int i = 0; i < M->size1; i++) {
+        for(int j = 0; j < M->size2; j++) {
+            printf("%10g\t", gsl_matrix_get(M, i, j));
+        }
+        printf("\n");
+    }
+}
+
+void GS_decomp(gsl_matrix* A, gsl_matrix* R) {
+    int n = A -> size1;
+    int m = A -> size2;
+    for(int i=0;i<m;i++) {
+        gsl_vector_view ai = gsl_matrix_column(A,i);
+        double Rii = gsl_blas_dnrm2(&(ai.vector));
+        gsl_matrix_set(R,i,i,Rii);
+        gsl_vector_scale(&(ai.vector),1/Rii);
+        for(int j=i+1;j<m;j++) {
+            gsl_vector_view aj = gsl_matrix_column(A,j);
+            double Rij;
+            gsl_blas_ddot(&(ai.vector),&(aj.vector),&Rij);
+            gsl_matrix_set(R,i,j,Rij);
+            gsl_vector* qiRij = gsl_vector_alloc(n);
+            gsl_vector_memcpy(qiRij,&(ai.vector));
+            gsl_vector_scale(qiRij,Rij);
+            gsl_vector_sub(&(aj.vector),qiRij);
+            gsl_vector_free(qiRij);
+        }
+    }
+}
+
+void GS_solve(gsl_matrix* Q, gsl_matrix* R, gsl_vector* b, gsl_vector* x) {
+    assert(Q->size1==Q->size2);
+    int m = Q -> size2;
+    gsl_blas_dgemv(CblasTrans,1,Q,b,0,x);
+    for(int i=m-1;i>=0;i--) {
+        double xi = gsl_vector_get(x,i);
+        for(int j=i+1;j<m;j++) {
+            xi += -gsl_matrix_get(R,i,j)*gsl_vector_get(x,j);
+        }
+        xi /= gsl_matrix_get(R,i,i);
+        gsl_vector_set(x,i,xi);
+    }
+}
+
+void rkstep12(void f(double t,gsl_vector* y,gsl_vector* dydt),double t,gsl_vector* yt,double h,gsl_vector* yh,gsl_vector* err) {
+    gsl_vector* k_zero = gsl_vector_alloc(yt->size);
+    f(t,yt,k_zero);
+    gsl_vector_memcpy(err,k_zero);
+    gsl_vector_scale(err,-1.0);
+    gsl_vector_scale(k_zero,h/2);
+    gsl_vector_add(k_zero,yt);
+    f(t+h/2,k_zero,yh);
+    gsl_vector_add(err,yh);
+    gsl_vector_scale(err,h);
+    gsl_vector_scale(yh,h);
+    gsl_vector_add(yh,yt);
+    gsl_vector_free(k_zero);
+}
+
+int driver(void f(double,gsl_vector*,gsl_vector*),double a,gsl_vector* ya,double b,gsl_vector* yb,\
+           double h,double acc,double eps, char* save_path) {
+    FILE* path_stream = fopen(save_path,"a");
+    if(save_path!="N") {
+        fprintf(path_stream,"%g ",a);
+        for(int i=0;i<ya->size;i++) {fprintf(path_stream,"%g ",gsl_vector_get(ya,i));} fprintf(path_stream,"\n");
+    }
+    gsl_vector_memcpy(yb,ya);
+    int n = 1;
+    double x = a;
+    double step_size = h;
+    while(x<b) {
+        gsl_vector* yx = gsl_vector_alloc(ya->size);
+        gsl_vector* err = gsl_vector_alloc(ya->size);
+        rkstep12(f,x,yb,step_size,yx,err);
+        double loc_tol = (eps*gsl_blas_dnrm2(yb)+acc)*sqrt(step_size/(b-a));
+        double loc_err = gsl_blas_dnrm2(err);
+        if(loc_tol>loc_err) {
+            n++;
+            x += step_size;
+            gsl_vector_memcpy(yb,yx);
+            if(save_path!="N") {
+                fprintf(path_stream,"%g ",x);
+                for(int i=0;i<ya->size;i++) {fprintf(path_stream,"%g ",gsl_vector_get(yb,i));} fprintf(path_stream,"\n");
+            }
+        }
+        step_size *= pow(loc_tol/loc_err,0.25)*0.95;
+        gsl_vector_free(yx);
+        gsl_vector_free(err);
+    }
+    fclose(path_stream);
+return n;
+}
+
+int search(int n, double* x, double z){
+	assert(x[0]<=z && z<=x[n-1]);
+	int i=0, j=n-1;
+	while(j-i>1){
+		int mid=(i+j)/2;
+		if(z>x[mid]) i=mid; else j=mid;
+	}
+return i;
+}
+
+void cubic_interpol(int n, double x[], double y[], cubic_coefs* a) {
+	gsl_matrix* A = gsl_matrix_alloc(n,n);
+	gsl_vector* b = gsl_vector_alloc(n);
+	gsl_vector* B = gsl_vector_alloc(n);
+	gsl_vector_set(B,0,(3*(y[1]-y[0])/(x[1]-x[0])));
+	gsl_vector_set(B,n-1,(3*(y[n-1]-y[n-2])/(x[n-1]-x[n-2])));
+	for(int i=0;i<n-2;i++) {
+		double B_i1 = 3*((y[i+1]-y[i])/(x[i+1]-x[i])+(y[i+2]-y[i+1])/(x[i+2]-x[i+1])*(x[i+1]-x[i])/(x[i+2]-x[i+1]));
+		gsl_vector_set(B,i+1,B_i1);
+	}
+	for(int i=0;i<n;i++) {
+		for(int j=0;j<n;j++) {
+			if(abs(i-j)>1) {
+				gsl_matrix_set(A,i,j,0);
+			}
+			if((i-j)==1) {
+				gsl_matrix_set(A,i,j,1);
+			}
+			if((i-j==-1)) {
+				if(i==0) {gsl_matrix_set(A,i,j,1);}
+				else {
+					double Qi = (x[i]-x[i-1])/(x[i+1]-x[i]);
+					gsl_matrix_set(A,i,j,Qi);
+				}
+			}
+			if((i-j)==0) {
+				if(i==0 || i==n-1) {gsl_matrix_set(A,i,j,2);}
+				else {
+					double Di = 2*((x[i]-x[i-1])/(x[i+1]-x[i]))+2;
+					gsl_matrix_set(A,i,j,Di);
+				}
+			}
+		}
+	}
+	gsl_linalg_HH_solve(A,B,b);
+	for(int i=0;i<n-1;i++) {
+		double pi = (y[i+1]-y[i])/(x[i+1]-x[i]);
+		double bi = gsl_vector_get(b,i);
+		double bi1 = gsl_vector_get(b,i+1);
+		(*a).b[i] = bi;
+		(*a).c[i] = (3*pi-2*bi-bi1)/(x[i+1]-x[i]);
+		(*a).d[i] = (bi+bi1-2*pi)/pow((x[i+1]-x[i]),2);
+	}
+	gsl_matrix_free(A);
+	gsl_vector_free(b);
+	gsl_vector_free(B);
+}
+
+double cubic_eval(cubic_coefs coefs, int n, double* x, double* y, double z) {
+	int i = search(n,x,z);
+return y[i]+(coefs.b)[i]*(z-x[i])+(coefs.c)[i]*pow((z-x[i]),2)+(coefs.d)[i]*pow((z-x[i]),3);
+}
+
+void newton_root(void f(gsl_vector* x, gsl_vector* fx), gsl_vector* x, double eps) {
+    int dim = x->size;
+    gsl_matrix* J = gsl_matrix_alloc(dim,dim);
+    gsl_matrix* JR = gsl_matrix_alloc(dim,dim);
+    gsl_vector* fx = gsl_vector_alloc(dim);
+    gsl_vector* fdx = gsl_vector_alloc(dim);
+    gsl_vector* Dx = gsl_vector_alloc(dim);
+    f(x,fx);
+    //printf("Dim:%i\n",dim);
+    //printf("x: %g\n",gsl_vector_get(x,0));
+    //printf("f(x): %g\n",gsl_vector_get(fx,0));
+    double stepsize = 1;
+    while(gsl_blas_dnrm2(fx) > eps && stepsize > DX) {
+        for(int j=0;j<dim;j++) {
+            double* xk = gsl_vector_ptr(x,j);
+            for(int i=0;i<dim;i++) {
+                f(x,Dx);
+                double fi = gsl_vector_get(Dx,i);
+                //printf("%.10g\n",*xk);
+                //printf("fi: %.10g\n",fi);
+                *xk += DX; f(x,Dx);
+                double dfi = gsl_vector_get(Dx,i);
+                //printf("%.10g\n",*xk);
+                //printf("dfi: %.10g\n",dfi);
+                *xk -=DX;
+                gsl_matrix_set(J,i,j,(dfi-fi)/DX);
+            }
+        }
+        //printf("Derivative: %g\n",gsl_matrix_get(J,0,0));
+        gsl_vector_scale(fx,-1.0);
+        GS_decomp(J,JR);
+        GS_solve(J,JR,fx,Dx);
+        gsl_vector_scale(fx,-1.0);
+        double l = 1;
+        gsl_blas_daxpy(l,Dx,x);
+        f(x,fdx);
+        while(gsl_blas_dnrm2(fdx) > (1-l)*gsl_blas_dnrm2(fx) && l > (1.0/64.0)) {
+            l /= 2;
+            gsl_blas_daxpy(-l,Dx,x);
+            f(x,fdx);
+        }
+        f(x,fx);
+        //printf("x: %g\n",gsl_vector_get(x,0));
+        //printf("f(x): %g\n",gsl_vector_get(fx,0));
+        stepsize = gsl_blas_dnrm2(Dx)*l;
+    }
+    gsl_matrix_free(J);
+    gsl_matrix_free(JR);
+    gsl_vector_free(fx);
+    gsl_vector_free(fdx);
+    gsl_vector_free(Dx);
+}
\ No newline at end of file
diff --git a/homework/root-finding/functions.h b/homework/root-finding/functions.h
new file mode 100755
index 0000000..8035849
--- /dev/null
+++ b/homework/root-finding/functions.h
@@ -0,0 +1,33 @@
+#ifndef FUNCTIONS_H
+#define FUNCTIONS_H
+
+#include<math.h>
+#include<time.h>
+#include<stdio.h>
+#include<float.h>
+#include<assert.h>
+#include<gsl/gsl_vector.h>
+#include<gsl/gsl_matrix.h>
+#include<gsl/gsl_blas.h>
+#include<gsl/gsl_linalg.h>
+#define RND (double)rand()/10000
+#define DX sqrt(DBL_EPSILON)
+typedef struct {double* b; double* c; double* d;} cubic_coefs;
+
+void f(gsl_vector* x, gsl_vector* fx);
+void radial(double r, gsl_vector* y, gsl_vector* dydr);
+double Fe_simple(double energy, double rmax, char* save_path);
+void aux(gsl_vector* x, gsl_vector* fx);
+void print_vector(char s[], gsl_vector* v);
+void print_matrix(gsl_matrix* M);
+void GS_decomp(gsl_matrix* A, gsl_matrix* R);
+void GS_solve(gsl_matrix* Q, gsl_matrix* R, gsl_vector* b, gsl_vector* x);
+void rkstep12(void f(double t,gsl_vector* y,gsl_vector* dydt),double t,gsl_vector* yt,double h,gsl_vector* yh,gsl_vector* err);
+int driver(void f(double,gsl_vector*,gsl_vector*),double a,gsl_vector* ya,double b,gsl_vector* yb,\
+           double h,double acc,double eps,char* save_path);
+int search(int n, double* x, double z);
+void cubic_interpol(int n, double x[], double y[], cubic_coefs* a);
+double cubic_eval(cubic_coefs coefs, int n, double* x, double* y, double z);
+void newton_root(void f(gsl_vector* x, gsl_vector* fx), gsl_vector* x, double eps);
+
+#endif
\ No newline at end of file
diff --git a/homework/root-finding/improved_wave.png b/homework/root-finding/improved_wave.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c8fb2f4557dc16cc650cf0fb2dab8d7aec9abd3
GIT binary patch
literal 7944
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

literal 0
HcmV?d00001

diff --git a/homework/root-finding/main.c b/homework/root-finding/main.c
new file mode 100755
index 0000000..456dd1e
--- /dev/null
+++ b/homework/root-finding/main.c
@@ -0,0 +1,75 @@
+#include "functions.h"
+#define nr 2*64
+
+static double xs[nr]; static double ys[nr];
+static double my_cubic_b[nr-1];
+static double my_cubic_c[nr-1];
+static double my_cubic_d[nr-1];
+static cubic_coefs coefs = {.b=my_cubic_b,.c=my_cubic_c,.d=my_cubic_d};
+
+void aux(gsl_vector* x, gsl_vector* fx) {
+    double energy = gsl_vector_get(x,0);
+    double M = cubic_eval(coefs,nr,xs,ys,energy);
+    gsl_vector_set(fx,0,M);
+}
+
+int main() {
+    printf("Finding root of Rosenbrock's valley function:\n");
+    gsl_vector* x0 = gsl_vector_alloc(2);
+    gsl_vector_set(x0,0,-3);
+    gsl_vector_set(x0,1,3);
+    print_vector("Starting guess:",x0);
+    newton_root(f,x0,1e-9);
+    print_vector("Found root:",x0);
+    gsl_vector_free(x0);
+
+    printf("\n\nFinding bound states of hydrogen with simple boundary:\n");
+    //Making spline of Fe(rmax)(e) since its instability makes newtons method inable to calculate proper derivates (See func.png)
+    for(int rmax=2;rmax<=10;rmax+=2) {
+        int index = 0;
+        for(double e=-2;e<0;e+=2.0/(nr)) {xs[index]=e;ys[index]=Fe_simple(e,rmax,"N");index+=1;}
+        cubic_interpol(nr,xs,ys,&coefs);
+        gsl_vector* x00 = gsl_vector_alloc(1);
+        double guess = -1.0;
+        gsl_vector_set(x00,0,guess);
+        printf("Rmax = %i\n",rmax);
+        print_vector("Starting guess:",x00);
+        newton_root(aux,x00,1e-9);
+        print_vector("Found root:",x00);
+        double energy = gsl_vector_get(x00,0);
+        char filename[30];
+        sprintf(filename,"simplepath%i.txt",rmax);
+        Fe_simple(energy,rmax,filename);
+        gsl_vector_free(x00);
+    }
+    printf("\n\nFinding bound states of hydrogen with improved boundary:\n");
+    for(int rmax=1;rmax<=4;rmax++) {
+        int index = 0;
+        double rd = (double)rmax;
+        for(double e=-2;e<0;e+=2.0/(nr)) {xs[index]=e;ys[index]=Fe_simple(e,rmax,"N")-rd*exp(-rd*sqrt(-2*e));index+=1;}
+        cubic_interpol(nr,xs,ys,&coefs);
+        gsl_vector* x00 = gsl_vector_alloc(1);
+        double guess = -1.0;
+        gsl_vector_set(x00,0,guess);
+        printf("Rmax = %i\n",rmax);
+        print_vector("Starting guess:",x00);
+        newton_root(aux,x00,1e-9);
+        print_vector("Found root:",x00);
+        double energy = gsl_vector_get(x00,0);
+        char filename[30];
+        sprintf(filename,"improvedpath%i.txt",rmax);
+        Fe_simple(energy,rmax,filename);
+        gsl_vector_free(x00);
+    }
+    FILE* exact_stream = fopen("exact.txt","w");
+    for(double r=1e-3;r<8;r+=1.0/64) {
+        fprintf(exact_stream,"%g %g\n",r,r*exp(-r));
+    }
+    fclose(exact_stream);
+    FILE* plot_stream = fopen("Fe.txt","w");
+    for(double r=-0.35;r<-0.32;r+=1.0e-4) {
+        fprintf(plot_stream,"%g %g\n",r,Fe_simple(r,8,"N"));
+    }
+    fclose(plot_stream);
+return 0;
+}
\ No newline at end of file
diff --git a/homework/root-finding/out.txt b/homework/root-finding/out.txt
new file mode 100644
index 0000000..fb3a8a4
--- /dev/null
+++ b/homework/root-finding/out.txt
@@ -0,0 +1,58 @@
+Finding root of Rosenbrock's valley function:
+Starting guess:
+             -3
+              3
+Found root:
+              1
+              1
+
+
+Finding bound states of hydrogen with simple boundary:
+Rmax = 2
+Starting guess:
+             -1
+Found root:
+      -0.127929
+Rmax = 4
+Starting guess:
+             -1
+Found root:
+      -0.483549
+Rmax = 6
+Starting guess:
+             -1
+Found root:
+      -0.499289
+Rmax = 8
+Starting guess:
+             -1
+Found root:
+      -0.499977
+Rmax = 10
+Starting guess:
+             -1
+Found root:
+           -0.5
+
+
+Finding bound states of hydrogen with improved boundary:
+Rmax = 1
+Starting guess:
+             -1
+Found root:
+      -0.500014
+Rmax = 2
+Starting guess:
+             -1
+Found root:
+      -0.500873
+Rmax = 3
+Starting guess:
+             -1
+Found root:
+      -0.500605
+Rmax = 4
+Starting guess:
+             -1
+Found root:
+      -0.500018
diff --git a/homework/root-finding/simple_wave.png b/homework/root-finding/simple_wave.png
new file mode 100644
index 0000000000000000000000000000000000000000..d032b1aa7191d94db1af02ef66ff14a135fdb74e
GIT binary patch
literal 8631
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
YRV~5#-{pTp!jIbYw2U+>)d`XR1F&CatpET3

literal 0
HcmV?d00001

-- 
GitLab