需要一个由牛顿迭代法和二分法制作的分形程序,可以使用一些特殊函数,并且当根超过25个时,可以制作25个根的分型图,需要具体代码
时间: 2023-03-26 20:03:11 浏览: 126
你好,关于你的问题,我可以回答。以下是一个由牛顿迭代法和二分法制作的分形程序的示例代码:
#include <stdio.h>
#include <math.h>
#define MAX_ITER 100
#define EPSILON 1e-6
double f(double x) {
return sin(x) - x / 2;
}
double df(double x) {
return cos(x) - .5;
}
double newton(double x) {
int i;
double xn = x;
for (i = ; i < MAX_ITER; i++) {
double fxn = f(xn);
double dfxn = df(xn);
if (fabs(fxn) < EPSILON) {
return xn;
}
xn = xn - fxn / dfxn;
}
return xn;
}
double bisect(double a, double b) {
double fa = f(a);
double fb = f(b);
if (fa * fb > ) {
return NAN;
}
while (b - a > EPSILON) {
double c = (a + b) / 2;
double fc = f(c);
if (fc == ) {
return c;
}
if (fa * fc < ) {
b = c;
fb = fc;
} else {
a = c;
fa = fc;
}
}
return (a + b) / 2;
}
int main() {
int i, j;
double roots[25];
int num_roots = ;
for (i = ; i < 100; i++) {
double x = (double) i / 100 * 2 * M_PI;
double root = newton(x);
int found = ;
for (j = ; j < num_roots; j++) {
if (fabs(root - roots[j]) < EPSILON) {
found = 1;
break;
}
}
if (!found) {
roots[num_roots++] = root;
}
if (num_roots >= 25) {
break;
}
}
for (i = ; i < num_roots; i++) {
for (j = ; j < 100; j++) {
double x = (double) j / 100 * 2 * M_PI;
double y = bisect(x, roots[i]);
if (!isnan(y)) {
printf("%f %f\n", x, y);
}
}
}
return ;
}
这个程序使用了 sin(x) - x / 2 这个函数,并使用牛顿迭代法和二分法求出了它的根。当根的数量超过25个时,程序会停止计算,并输出25个根的分型图。
阅读全文