1)首先观察一下等式两边的两个函数的图形,不难发现他们应该只有一个交点,也就是说方程只有一个根;2)先把方程右边的式子移到方程左边:lgx+2x-1=0;3)把x用实际的数代入,输入计算器计算;4)如果结果大于0,则lgx在2x-1的上方,从图像上分析方程根应该比你刚才的取值要小,进入第5步;如果大于0,则情况相反;5)如果前一次用来计算的取值太大那么就取一个小一些的数重新计算,直到所用的数也就是方程根达到要求的精度为止第二道题目的解题思路是完全一样的,关键都在于掌握函数图像的特点
这是只能保留两位小数要求计算出来的根(1)061(2)100f(x)=x^2-2 f(141)<0 f(142)>0
(1)第一个求解区间[141,142] 区间中值=1415
|f(141)|=00119 |f(1415)|=0002225 |f(142)|=00164 去掉右端点
(2)第二个求解区间[141,1415] 区间中值=14125
|f(14125)|=000484375 去掉左端点
(3)第三个求解区间[14125,1415] 区间中值=141375
|f(141375)|=00013109375 去掉左端点
(4)第四个求解区间[141375,1415] 区中间值=1414375
|f(1414375)|=0000456640625
按照精度0005的要求,相邻两根之差 < 0005的要求,x=1415 已是满足精度要求
的近似根了!由于该方程是开方运算,最后的近似根为:x≈±1415
而第四步迭代的结果:x=1414375 的精度以达到了00006
#include <stdioh>
#include <mathh>
double f1(double x)
{ double y=cos(x)-x;
return y;
}
double f2(double x)
{
double z=-sin(x)-1;
return z;
}
main()
{
double xn=10;
while(fabs(f1(xn))>1e-6)
xn=xn-f1(xn)/f2(xn);
printf("%f\n",xn);
}
扩展资料
多数方程不存在求根公式,因此求精确根非常困难,甚至不可解,从而寻找方程的近似根就显得特别重要。方法使用函数 的泰勒级数的前面几项来寻找方程的根。
牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。
公式有没有错误,我没有细看。从程序的设计上看,你的代码至少有两个错误:
循环条件 m !=0 。这里的m是一个float,float变量有精度,所以 m != 0这个条件会一起为true,也就是你的for循环将永远不能结束。float变量与0做判断,不能用==、!=,而应该判断m的绝对值是否小于一个门限,比如0000001
你在找到交点x之后,令a = x。也就是说,下一步将在(x, b)之间找交点。但是,这里你怎么确定交点是在(x, b)之间,而不是在(a, x)之间呢?这里设计有问题,在找到交点x之后,应该判断下f(x)的值。已知f(a) < 0,f(b) > 0,若f(x) < 0,那下一步应该在(x, b)之间继续找,但是如果f(x) > 0,那下一步应该在(a, x)之间继续找。
我试验了下,发现这个函数,用这个方法收敛不了。最后得到的交点对应的y值,收敛到0001就没法再减小了。
int main()
{
float a, b, m, n, y, x;//a,b代表x1,x2 m,n代表y1,y2
a = 0;
b = 10;
m = ss(a);
n = ss(b);
y = n;
for (; fabs(y) > 00001;)
{
//(n - m) / (b - a) = (0 - m) / (x - a)
x = m (a - b) / (n - m) + a;
y = ss(x);
printf("%f\n", y);
if (y > 0)
{
b = x;
n = y;
}
else
{
a = x;
m = y;
}
}//循环的目的就是不断的求横坐标,直到y值等于0,就求出了近似根
printf("%f", x);
return 0;
}
看来对太高次函数,用这个方法效果不好。你可以把ss函数的次数改小点用这个方法试试看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)