二分法求解非线性方程的困惑

mxhtju 2007-06-17 12:34:37
在网上参考了其它人的二分法求解一道非线性方程题:求方程 lnx=x-2 在2.0到3.0范围的解,我写的代码如下:


#include <stdio.h>
#include <math.h>
void main()
{
double lpoint=2.0,rpoint=3.0,mpoint;
mpoint=(lpoint+rpoint)/2;
while(fabs(expression1(mpoint))>0.00001)
{
mpoint=(lpoint+rpoint)/2;
if(expression1(lpoint)*expression1(mpoint)<0)
rpoint=mpoint;
else
lpoint=mpoint;
}
printf("二分法所求解非线性方程 lnx=x-2 的结果: x=%d\n",mpoint);
}
double expression1(double x)
{
double result;
result=ln(x);
return result;
}

double expression2(double x)
{
double result;
result=x-2.0;
return result;
}


运行时提示错误,“与‘expression1’声名的类型不匹配”
我不太明白哪出了问题,哪位帮小弟看看是怎么回事?
...全文
522 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxhtju 2007-06-17
  • 打赏
  • 举报
回复
自然对数函数ln,在turbo c 2.0 里是怎么定义的?
mxhtju 2007-06-17
  • 打赏
  • 举报
回复
谢谢你!

函数定义放到 main 之前,的确不再提示类型不符。

但是,提示:

Error: Undefined symbol _ln in module

这是咋回事啊?
Y___Y 2007-06-17
  • 打赏
  • 举报
回复
double expression1(double x)
{
double result;
result=ln(x);
return result;
}

double expression2(double x)
{
double result;
result=x-2.0;
return result;
}
这段代码放到main()前面
lightnut 2007-06-17
  • 打赏
  • 举报
回复
不知道怎么搞得,................但是运行之后弹出的dos窗口啥都不显示,郁闷死了
==========================================================
1.你要求的是lnx=x-2即lnx-(x-2)=0的根, 而你的程序确是在求lnx(or log10(x))的根(因为你
只调用了expression1(x), 而expression1(x)是计算ln(x)的值!).
2. 二分法的前提是在求根区间[a,b],f(a)和f(b)必须异号, 即f(a)*f(b)<0, 否则你好需要划界,即找到端点函数值异号的区间.

以下是修改的程序,它在不满足f(a)*f(b)<0时, 会显示错误, 若满足f(a)*f(b)<0, 它会给出一个满足|f(x)|<eps(精度)的解.


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

double expression(double x)
{
return log(x) - (x-2);
}

int main()
{
double lpoint,rpoint,mpoint;

printf("请输入求根区间(xl,xr):");
scanf("%lf %lf", &lpoint, &rpoint);

mpoint=(lpoint+rpoint)/2;

if (expression(lpoint)*expression(rpoint)>0)
{
printf("输入错误: f(xl)和f(xr)同号\n", lpoint, rpoint);
printf("f(%g)=%g, f(%g)=%g\n", lpoint, expression(lpoint),rpoint, expression(rpoint));
exit(1);
}

while(fabs(expression(mpoint))>0.00001)
{
mpoint=(lpoint+rpoint)/2;
if(expression(lpoint)*expression(mpoint)<0)
rpoint=mpoint;
else
lpoint=mpoint;
}
printf("二分法所求解非线性方程 lnx=x-2 的结果: x=%g, f(x)=%g\n",mpoint, expression(mpoint));

return 0;
}

//运行1:
请输入求根区间(xl,xr):1.0 3.0
输入错误: f(xl)和f(xr)同号
f(1)=1, f(3)=0.0986123

//运行2:
请输入求根区间(xl,xr):1.0 4.0
二分法所求解非线性方程 lnx=x-2 的结果: x=3.14618, f(x)=9.56477e-006

Y___Y 2007-06-17
  • 打赏
  • 举报
回复
自然对数是log函数
mxhtju 2007-06-17
  • 打赏
  • 举报
回复
不知道怎么搞得,我把ln() 改成log10(x),然后把求值区间改成【1.0,10.0】,不再提示错误,但是运行之后弹出的dos窗口啥都不显示,郁闷死了


#include <stdio.h>
#include <math.h>
double expression1(double x)
{
double result;
result=log10(x);
return result;
}

double expression2(double x)
{
double result;
result=x-2.0;
return result;
}
void main()
{
double lpoint=1.0,rpoint=10.0,mpoint;
mpoint=(lpoint+rpoint)/2;
while(fabs(expression1(mpoint))>0.00001)
{
mpoint=(lpoint+rpoint)/2;
if(expression1(lpoint)*expression1(mpoint)<0)
rpoint=mpoint;
else
lpoint=mpoint;
}
printf("二分法所求解非线性方程 lnx=x-2 的结果: x=%d\n",mpoint);
}

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧