Chem 302 Lab Assignment Tuesday 2:30 – 4:00 Colin Chris M Johnathan P Craig Jonathan E Alex Tuesday 4:00 – 5:30 Curtis Matt Chris L Janet Cory Kristen.

Presentation on theme: "Chem 302 Lab Assignment Tuesday 2:30 – 4:00 Colin Chris M Johnathan P Craig Jonathan E Alex Tuesday 4:00 – 5:30 Curtis Matt Chris L Janet Cory Kristen."— Presentation transcript:

Chem 302 Lab Assignment Tuesday 2:30 – 4:00 Colin Chris M Johnathan P Craig Jonathan E Alex Tuesday 4:00 – 5:30 Curtis Matt Chris L Janet Cory Kristen

Chem 302 - Math 252 Chapter 1 Solutions of nonlinear equations

Roots of Nonlinear Equations Many problems in chemistry involve nonlinear equations Linear and quadratic equations are trivial, can be solved analytically Cubic and higher order solve numerically Present a overview of basic methods Not a complete discussion

Successive Approximations Simplest method Want to solve f(x)=0 rearrange into the form x=g(x) Use as iteration formula x i+1 =g(x i ) Use initial guess and iterate until self consistent

Successive Approximations

ixixi 00 10.666667 20.814815 30.887974 40.929500 50.954656 60.970456 70.980595 80.987189 90.991514 100.994367 110.996255 120.997508 130.998341 140.998895 150.999264 160.999509 ixixi 170.999673 180.999782 190.999855 200.999903 210.999935 220.999957 230.999971 240.999981 250.999987 260.999991 270.999994 280.999996 290.999997 300.999998 310.999999 320.999999

Successive Approximations Second root

Successive Approximations Second root

Successive Approximations Different formula Will find x=2, will not find x=1 Different formula – different results No one formula is best Slow to converge

Successive Approximations How to find initial guesses? Grid search Course to start Get finer

Analysis of Convergence Each stage of iteration x i+1 =g(x i ) For convergence True root Intersection of two functions: x & g(x)

Analysis of Convergence

Four possibilities –Monotonic convergence –Oscillating convergence –Monotonic divergence –Oscillating divergence Analysis of Convergence

Monotonic convergence

Oscillating convergence

Monotonic divergence

Oscillating divergence

Analysis of Convergence Key is g (x) Mean Value Theorem –If g(x) and g (x) are continuous on the interval [a,b] then there exists an (a< <b) such that

Analysis of Convergence

To converge LHS 0 If M < 1 guaranteed to converge Sufficient but not necessary

Speed of Convergence Taylor expansion about root For x i When close to convergence Dominant term will be 1 st nonzero derivative Order of Convergence

One of most common methods Usually 2 nd order convergence Generally superior to simple iteration Uses function and 1 st derivative to predict root (assume f is linear) Newton-Raphson Method

Fairly robust Need analytic expressions for f(x) and f'(x) –May be complicated or not available Need to evaluate f(x) and f'(x) many times –Maximum efficiency f'(x) close to zero will cause problems –Especially important for multiple roots –Need to checks in program Value of f'(x) Max iterations

Newton-Raphson Method Test conditions Convergence

NR but use numeric derivative Secant Method Need two points to start

Similar to Secant Method Uses two points (one on each side of root) (need search) Find where function would be zero if linear between two points During each iteration one point is held fixed (pivot), other is moved More stable but slower than NR If pivot far from root then slow If pivot close to root then denominator can be small False-Position Method

Algorithm –Pick x L & x R (x L < < x R ) –Evaluate –Calculate –If then x M is the root –Replace x L or x R with x M (depends on sign of ) False-Position Method Repeat xLxL xRxR xMxM

False-Position Method

Same as FP Method but x M is average of x L & x R Drawbacks of both FP & Bisection –Two initial guesses on opposite sides of root Multiple or close roots a problem f always same sign a problem –Round-off error as x M gets close to root Secant, FP & Bisection methods do not require analtyic expression of f'(x) Bisection Method

Want as efficient an algorithm as possible –Efficiency of operations + * / Power –Naive method (10 ×, 4 +) –Most efficient method for polynomial of order m requires m additions and m multiplications –Nesting (Horners Method) Roots of Polynomials

For polynomial of degree m Horners Method Divide by (x-r) b 0 is f(r)

Horners Method m ×, m +

Horners Method 1 is a root

Horners Method 2 is a root

If b 0 = 0 (i.e. r is a root) Horners Method Have factored (x-r) from equation (i.e. reduced order, called deflating) Continue to find roots of reduced equation

Horners Method 2 is a root (i.e. a double root of original equation)

Birge-Vieta Method NR method with f(x) and f'(x) evaluated using Horners method Once a root is found, reduce order of polynomial

Birge-Vieta Method

Example

NR x 0 4.33 3 x 0 > 4.33 5 Third root? Try it!!!

BV

Roots of Polynomials What about complex roots? –Occur in pairs –Have form + i & – i –Roots of quadratic equation f(x) = x 2 – 2 x + 2 + 2 BV method – we removed factors of x – r. Quadratic can be solved analytically – therefore best to remove quadratic factors

Lin-Bairstow Method

Iteration Scheme

Lin-Bairstow Method Algorithm –m > 3: determine quadratic roots, reduce order of problem by 2 –m = 3: determine linear root then quadratic roots –m = 2: determine quadratic roots –m = 1: determine linear root

1.// Lin Biarstow.cpp 2.#include "stdafx.h" 3.#include 4.#include 5.#include 6.#include 7.#include 8.#include 9.#include 10.#include 11.using namespace std; 12.int _tmain(int argc, _TCHAR* argv[]) 13.{ 14. double t=1e-8, *a, *b, *c,u,v,du,dv,r1,r2,ep,f,d; 15. int n,i; 16. FILE *logfile; 17. if((logfile=fopen("polynomial.txt","wt"))==NULL) 18. { 19. cout<<"Could not open log file.\n\nPress any key to exit."; 20. getch(); 21. return EXIT_FAILURE; 22. } 23. cout<<"Enter order of polynomial: "; 24. cin>>n; 25. fprintf(logfile,"Roots of the polynomial"); 26.a=new double[n+1]; 27. b=new double[n+1]; 28. c=new double[n+1]; 29. for(i=0;i<n+1;i++){ 30. cout<<"\nInput coefficient a["<<i<<"] "; 31. cin>>a[i]; 32. } 33. fprintf(logfile,"\n%lf %+lfx",a[0],a[1]); 34. for(i=2;i<n+1;i++)fprintf(logfile," %+lfx^%d",a[i],i); 35. cout<<"\n\nRoots of the polynomial are:\n"; 36. fprintf(logfile,"\n\nRoots are:\n"); 37. while (a[n]==0){n--;} 38. // make sure n>3 39. while(n>3) 40. { 41. u=0;v=0; 42. b[n]=c[n]=a[n];ep=1; 43. while(ep>t){ 44. b[n-1]=a[n-1]+u*b[n]; 45. c[n-1]=b[n-1]+u*c[n]; 46. for(i=n-2;i>0;i--) 47. { 48. b[i]=a[i]+u*b[i+1]+v*b[i+2]; 49. c[i]=b[i]+u*c[i+1]+v*c[i+2]; 50. }

26. b[0]=a[0]+u*b[1]+v*b[2]; 51. f=c[2]*c[2]-c[1]*c[3]; 52. if(f==0){du=dv=1;} 53. else{du=(b[0]*c[3]-b[1]*c[2])/f;dv=(c[1]*b[1]-c[2]*b[0])/f;} 54. u+=du; 55. v+=dv; 56. ep=sqrt(du*du+dv*dv); 57. } 58. d=u*u+4*v; 59. if(d<0) //complex roots 60. { 61. r1=u/2;r2=sqrt(-d)/2; 62. cout<<r1<<" + i"<<r2<<endl; 63. cout<<r1<<" - i"<<r2<<endl; 64. fprintf(logfile,"%lf + i%lf\n%lf - i%lf\n",r1,r2,r1,r2); 65. } 66. else // real roots 67. { 68. r1=u/2+sqrt(d)/2; 69. r2=u/2-sqrt(d)/2; 70. cout<<r1<<endl; 71. cout<<r2<<endl; 72. fprintf(logfile,"%lf\n%lf\n",r1,r2); 73. } 74. n-=2; 75. for(i=0;i<n+1;i++)a[i]=b[i+2]; 76. } 77.if(n==3){ 78. u=0; 79. b[n]=c[n]=a[n];ep=1; 80. while(ep>t){ 81. for(i=n-1;i>0;i--) 82. { 83. b[i]=a[i]+u*b[i+1]; 84. c[i]=b[i]+u*c[i+1]; 85. } 86. b[0]=a[0]+u*b[1]; 87. if(c[1]==0)du=1; 88. else du=-b[0]/c[1]; 89. u+=du; 90. ep=sqrt(du*du); 91. } 92. cout<<u<<endl; 93. fprintf(logfile,"%lf\n",u); 94. n--; 95. for(i=0;i<n+1;i++)a[i]=b[i+1]; 96. } 97. if(n==2){ 98. u=-a[1]/a[2]; 99. v=-a[0]/a[2]; 100. d=u*u+4*v;

101.if(d<0) //complex roots 102. { 103. r1=u/2;r2=sqrt(-d)/2; 104. cout<<r1<<" + i"<<r2<<endl; 105. cout<<r1<<" - i"<<r2<<endl; 106. fprintf(logfile,"%lf + i%lf\n%lf - i%lf\n",r1,r2,r1,r2); 107. } 108. else 109. { 110. r1=u/2+sqrt(d)/2; 111. r2=u/2-sqrt(d)/2; 112. cout<<r1<<endl; 113. cout<<r2<<endl; 114. fprintf(logfile,"%lf\n%lf\n",r1,r2); 115. } 116. } 117. else if(n==1){ 118. r1=-a[0]/a[1]; 119. cout<<r1<<endl; 120. fprintf(logfile,"%lf\n",r1); 121. } 122. delete[] a;delete[] b; delete[] c; 123. fclose(logfile); 124. cout<<"\n\nFinished finding roots. Press any key to exit.";getch(); 125.return EXIT_SUCCESS; 126.}

Roots of the polynomial -130.000000 +120.000000x -2.000000x^2 -9.000000x^3 +1.000000x^4 Roots are: 3.972068 -3.600135 7.399477 1.228589

Similar presentations