主题:程序如下,求大神指导问题出在何处,急!
已知方程y=x*x*x+2*x*x-exp(x) ,请分别用二分法、牛顿法和割线法求此方程的根。误差限取:1e-12 。注意先确定出方程的有根区间。比较计算次数和计算结果。比较三种方法的计算工作量和计算结果。
小生先大概编出了算法,但唯有牛顿法可算出结果,求改错
#include "stdio.h"
#include "math.h"
void main()
{
void function1();//二分法
void function2();//牛顿法
void function3();//割线法
int choice;
int a;
printf("请选择求解的方法:\n\t1.二分法\n\t2.牛顿法\n\t3.割线法\n:");
scanf("%d",&a);
switch(a)
{
case 1: function1();break;
case 2: function2();break;
case 3: function3();break;
}
}
void function1()
{
float x0,x1,x2,fx0,fx1,fx2,m;
printf("请输入x1的值和x2的值:\n");
scanf("%f%f",&x1,&x2);
do
{
fx1=x1*x1*x1+2*x1*x1-exp(x1);
fx2=x2*x2*x2+2*x2*x2-exp(x2);
}
while(fx1*fx2>0);
do
{ x0=(x1+x2)/2;
fx0=x0*x0*x0+2*x0*x0-exp(x0);
if((fx0*fx1)<0)
{ x2=x0;
fx2=fx0;
}
else
{ x1=x0;
fx1=fx0;
}
printf("%f\n",x0);
}
while(fabs(fx0)>=1e-12);
printf("运用二分法所求结果:%f\n",x0);
}
void function2()
{ float f,df,x,x0,n=0;
printf("请输入x的值:\n");
scanf("%f",&x);
printf("运用牛顿法所求结果:\n");
do
{ x0=x;
f=x0*x0*x0+2*x0*x0-exp(x);
df=3*x0*x0+4*x0-exp(x);
x=x0-f/df;
n++;printf("n=%f ",n);
printf("x=%f x0=%f\n",x,x0);
}
while((fabs(x-x0))>=1e-12);
}
void function3()
{
float x0,x1,fx1,fx0,x,fx,z,s;
printf("please in put z and s:\n");
scanf("%f%f",&z,&s);
x0=z;
x1=s;
fx0=x0*x0*x0+2*x0*x0-exp(x0);
fx1=x1*x1*x1+2*x1*x1-exp(x1);
do
{
x=(x0*fx1-x1*fx0)/(fx1-fx0);
fx=x*x*x+2*x*x-exp(x);
if(fx*fx0>0)
{ fx0=fx;
x0=x;
}
else
x1=x;
}
while(fabs(fx)>=1e-12);
printf("运用割线法所求结果:%f\n",x);
}
小生先大概编出了算法,但唯有牛顿法可算出结果,求改错
#include "stdio.h"
#include "math.h"
void main()
{
void function1();//二分法
void function2();//牛顿法
void function3();//割线法
int choice;
int a;
printf("请选择求解的方法:\n\t1.二分法\n\t2.牛顿法\n\t3.割线法\n:");
scanf("%d",&a);
switch(a)
{
case 1: function1();break;
case 2: function2();break;
case 3: function3();break;
}
}
void function1()
{
float x0,x1,x2,fx0,fx1,fx2,m;
printf("请输入x1的值和x2的值:\n");
scanf("%f%f",&x1,&x2);
do
{
fx1=x1*x1*x1+2*x1*x1-exp(x1);
fx2=x2*x2*x2+2*x2*x2-exp(x2);
}
while(fx1*fx2>0);
do
{ x0=(x1+x2)/2;
fx0=x0*x0*x0+2*x0*x0-exp(x0);
if((fx0*fx1)<0)
{ x2=x0;
fx2=fx0;
}
else
{ x1=x0;
fx1=fx0;
}
printf("%f\n",x0);
}
while(fabs(fx0)>=1e-12);
printf("运用二分法所求结果:%f\n",x0);
}
void function2()
{ float f,df,x,x0,n=0;
printf("请输入x的值:\n");
scanf("%f",&x);
printf("运用牛顿法所求结果:\n");
do
{ x0=x;
f=x0*x0*x0+2*x0*x0-exp(x);
df=3*x0*x0+4*x0-exp(x);
x=x0-f/df;
n++;printf("n=%f ",n);
printf("x=%f x0=%f\n",x,x0);
}
while((fabs(x-x0))>=1e-12);
}
void function3()
{
float x0,x1,fx1,fx0,x,fx,z,s;
printf("please in put z and s:\n");
scanf("%f%f",&z,&s);
x0=z;
x1=s;
fx0=x0*x0*x0+2*x0*x0-exp(x0);
fx1=x1*x1*x1+2*x1*x1-exp(x1);
do
{
x=(x0*fx1-x1*fx0)/(fx1-fx0);
fx=x*x*x+2*x*x-exp(x);
if(fx*fx0>0)
{ fx0=fx;
x0=x;
}
else
x1=x;
}
while(fabs(fx)>=1e-12);
printf("运用割线法所求结果:%f\n",x);
}