home *** CD-ROM | disk | FTP | other *** search
- program roots(input,output);
-
- type complex = record
- r:real;
- i:real;
- end;
-
- poly = array[0..50] of complex;
-
- var P,dP:poly;
- degree,i,i1,i2:integer;
- xpower:array[1..30] of complex;
- f,df,g1,g2,guess:complex;
- conv:boolean;
- ans:char;
- err:real;
-
- procedure ad(var outvar:complex; v1,v2:complex);
- var work:complex;
- begin
- work.r:=v1.r+v2.r;
- work.i:=v1.i+v2.i;
- outvar:=work;
- end;
-
- procedure mult(var outvar:complex; v1,v2:complex);
- var work:complex;
- begin
- work.r:=v1.r*v2.r-(v1.i*v2.i);
- work.i:=v1.i*v2.r+(v1.r*v2.i);
- outvar:=work;
- end;
-
- function mag(v1:complex):real;
- begin
- mag:=sqrt(sqr(v1.r)+sqr(v1.i));
- end;
-
- procedure recip(var v2:complex);
- var work:complex;
- d:real;
-
- begin
- d:=sqr(v2.r)+sqr(v2.i);
- work.r:=v2.r/d;
- work.i:=-v2.i/d;
- v2:=work;
- end;
-
- procedure GetComplex(var c:complex);
- begin
- writeln;
- write('Re:');
- readln(c.r);
- write('Im:');
- readln(c.i);
- end;
-
- procedure eval(var res:complex; c:complex;p1:poly;d:integer);
- var count:integer;
- t1,power:complex;
- begin
- res.r:=0;res.i:=0;
- power.r:=1;power.i:=0;
- for count:=0 to d do begin
- mult(t1,p1[count],power);
- ad(res,res,t1);
- mult(power,power,c);
- end;
- end;
-
-
- begin {Main Program}
- err:=0.000001;
- clrscr;
- writeln;
- writeln(' This program finds complex roots of real polynomials.');
- writeln(' By Roger R. Darr - May 27, 1990');
- writeln;
- write('Enter the degree of the polynomial (1-50):');readln(degree);
- writeln;
- for i:=0 to 50 do begin
- p[i].r:=0;p[i].i:=0;
- dp[i].r:=0;dp[i].i:=0;
- end;
- for i:=0 to degree do begin
- write('A',i,'= ');readln(p[i].r);
- if i>0 then dp[i-1].r:=p[i].r*i;
- end;
- repeat
- writeln('Enter an initial guess. Note: to find complex-conjugate');
- writeln('roots, you must include an imaginary part in your guess.');
- getcomplex(guess);
- g2:=guess;
- i1:=0;
- repeat
- g1:=g2;
- eval(f,g1,p,degree);
- eval(df,g1,dp,degree-1);
- recip(df);
- mult(g2,f,df);
- g2.r:=-g2.r;
- g2.i:=-g2.i;
- ad(g2,g2,g1);
- i1:=i1+1;
- conv:= (abs(g2.i-g1.i)<err) and (abs(g2.r-g1.r)<err);
- until conv or (i1>100);
- if not conv then writeln('Does not converge.')
- else begin
- writeln('Root = ',g2.r:10:5,' + j',g2.i:10:5);
- end;
- writeln;
- write('Again ? ');readln(ans);
- until (ans='n') or (ans='N');
- end.
-