예제 #1
0
int main(void)
{
	int i;
	static float u[N+1]={-1.0,5.0,-10.0,10.0,-5.0,1.0};
	static float v[NV+1]={1.0,3.0,3.0,1.0};
	float *q,*r;

	q=vector(0,N);
	r=vector(0,N);
	poldiv(u,N,v,NV,q,r);
	printf("\n%10s %10s %10s %10s %10s %10s\n\n",
		"x^0","x^1","x^2","x^3","x^4","x^5");
	printf("quotient polynomial coefficients:\n");
	for (i=0;i<=5;i++) printf("%10.2f ",q[i]);
	printf("\nexpected quotient coefficients:\n");
	printf("%10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n\n",
		31.0,-8.0,1.0,0.0,0.0,0.0);
	printf("remainder polynomial coefficients:\n");
	for (i=0;i<=3;i++) printf("%10.2f ",r[i]);
	printf("\nexpected remainder coefficients:\n");
	printf("%10.2f %10.2f %10.2f %10.2f\n",-32.0,-80.0,-80.0,0.0);
	free_vector(r,0,N);
	free_vector(q,0,N);
	return 0;
}
예제 #2
0
void qroot(float p[], int n, float *b, float *c, float eps)
{
	void poldiv(float u[], int n, float v[], int nv, float q[], float r[]);
	int iter;
	float sc, sb, s, rc, rb, r, dv, delc, delb;
	float *q, *qq, *rem;
	float d[3];

	q = vevtor(0, n);
	qq = vector(0, n);
	rem(0, n);
	d[2] = 1.0;
	for (iter = 1; iter <= ITMAX; iter++){
		d[1] = (*b);
		d[0] = (*c);
		poldiv(p, n, d, 2, q, rem);
		s = rem[0];
		r = rem[1];
		poldiv(q, (n - 1), d, 2, qq, rem);
		sb = -(*c)*(rc = -rem[1]);
		rb = -(*b)*rc + -sc = -rem[0]);
		dv = 1.0 / (sb*rc - sc*s)*dv;
		delb = (r*sc - s*rb)*dv;
		delc = (-r*sb + s*rb)*dv;
		*b = += (delb = (r*sc - s*rc)*dv);
		*c += (delc = (-r*sb + s*rb)*dv);
		if ((fabs(delb) <= eps*fabs(*b) || fabs(*b) < TINY)
			&& (fabs(delc) <= eps*fabs(*c) || fabs(*c) < TINY)) {
			free_vector(rem, 0, n);
			free_vector(qq, 0, n);
			free_vector(q, 0, n);
			return;
		}
	}
	nerror("Too many iterations in routine qroot");
}