兄弟们帮忙解个数学题

cgagoal 2009-08-29 03:06:34
x=-ln(1-Ax),其中x为未知数,A为常数
高等数学忘差不多了,很惭愧,特意到本版块来请兄弟们解答,
希望写出详细步骤,至少要得到一个用一般的程序语言能表达出x的式子。
...全文
195 点赞 收藏 30
写回复
30 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cgagoal 2009-08-31
结贴了,因为该贴分比较少,而linren作了大部分工作,所以有兄弟没得分的,请谅解
回复
cgagoal 2009-08-31
[Quote=引用 26 楼 linren 的回复:]
A=1的时候的确是只有0是等式的解……

0 <A <1的时候
除了0以外还有一个正数解……

A>1的时候
有0和一个负数解……

A <0的时候
只有0是等式的解……

0 <A <1的时候
想到了一个找正数解的办法:
C/C++ code#include<stdio.h>
#include<math.h>#define A 0.5int main(){double x1,x2;double a,b;int flg;
x2=1e-10;
a=x2;
b=-log(1-A*x2);if(a>b) flg=0;else flg=1;while(1){
x2+=1e-5;
a=x2;
b=-log(1-A*x2);if(flg==0){if(a<=b)break;
}else{if(a>b)break;
}
}while(1){
x1=-log(1-A*x2);if(x1>x2&&x1-x2<1e-30)break;elseif(x2-x1<1e-30)break;
x2=x1;
}
printf("x = %.10f\n",x1);return0;
}

正确的解大致是:1.59362425

程序得到的解是:
x =1.5936383852
Press any key to continue

精度方面比较难以达到较高的要求……
[/Quote]
本来A是在0~1之间的,x结果是正数,是我没说清楚,不好意思
谢谢大家的回复,特别是linren,上面是可以算到例题答案的解法
4位小数已经达到该题的要求了,非常感谢
回复
Paradin 2009-08-31
顶楼上。学习。
回复
linren 2009-08-31
A=1的时候的确是只有0是等式的解……

0<A<1的时候
除了0以外还有一个正数解……

A>1的时候
有0和一个负数解……

A<0的时候
只有0是等式的解……

0<A<1的时候
想到了一个找正数解的办法:
#include <stdio.h>
#include <math.h>

#define A 0.5

int main(){
double x1,x2;
double a,b;
int flg;
x2=1e-10;
a=x2;
b=-log(1-A*x2);
if(a>b) flg=0;
else flg=1;
while(1){
x2+=1e-5;
a=x2;
b=-log(1-A*x2);
if(flg==0){
if(a<=b) break;
}else{
if(a>b) break;
}
}
while(1){
x1=-log(1-A*x2);
if(x1>x2&&x1-x2<1e-30) break;
else if(x2-x1<1e-30) break;
x2=x1;
}
printf("x = %.10f\n",x1);

return 0;
}


正确的解大致是:1.59362425

程序得到的解是:
x = 1.5936383852
Press any key to continue

精度方面比较难以达到较高的要求……
回复
linren 2009-08-31
f'(a)=g'(a)
可能是说当x=a的时候
f(x)和g(x)两个函数在这里的斜率相等……

比如说A=2的时候……
x=(1-A)/A=-0.5


从上面的图中可以看到两个函数在x=-0.5的地方的斜率是相同的……
回复
Paradin 2009-08-31
不知道是不是我理解不对
设A=2带代去明显不对嘛
恒等函数才能两边求导
回复
simon582 2009-08-31
x=-ln(1-Ax)

x+ln(1-Ax)=0 二分法也可以得到零点吧 虽然弦截法看起来更高级..
回复
FlyinFish 2009-08-30
不知道是不是我理解有问题,这个不是一个基础代数问题吗?

x = 1 / (A - 1/n) ?
回复
linren2 2009-08-30

【程序】
#include <stdio.h>
#include <math.h>

#define A 2.0

int main(){
double x1,x2;
x1=0;x2=-1.0;
while(1){
x1=-log(1-A*x2);
if(x1>x2&&x1-x2<1e-30) break;
else if(x2-x1<1e-30) break;
x2=x1;
}
printf("x = %.10f\n",x1);

return 0;
}

【运行结果】
x = -1.2564312086
Press any key to continue

用迭代法的话……
初值的选择很重要……
上面的程序终于得到了一个能够相信的答案了……
回复
arong1234 2009-08-30
对不起,我误解你了,f'(x)=g'(x) ==> f(x)=g(x)是不行的,但是反过来可以
因此其实这个题目可以直接求解:
如果A=1,则,X=0是惟一解
否则X有两个解,X=0和X=(1-A)/A

[Quote=引用 12 楼 qinguan0619 的回复:]
直接两边求导。。。。
Python code1=-(-A/(1-AX)) (1-AX!=1)1-AX=A==> X=(1-A)/A

若1-AX=1;
X=0

python code:print"X1=0","X2=",(1-A)/A

[/Quote]
回复
arong1234 2009-08-30
问题是:求导的方法对于绝大多数情况都是错误的,而不是说特例情况不可行或者可行
很简单,f'(x)=g'(x)和f(x)+C=g(x)等价,导数方程相等,得到愿方程相等的机会是0
[Quote=引用 15 楼 qinguan0619 的回复:]
引用 14 楼 arong1234 的回复:
给你个简单的反例,1 = x*x,解是x=1,x=-1
两边同时求导得到 0 =2x,解是x=0
求导显然不是用来求方程解的正确方法
引用 12 楼 qinguan0619 的回复:
直接两边求导。。。。
Python code1=-(-A/(1-AX)) (1-AX!=1)1-AX=A==> X=(1-A)/A

若1-AX=1;
X=0

python code:print"X1=0","X2=",(1-A)/A



服了。。。。
求导是不是求方程解的正确方法,那得看题啊。。。
你总不能拿什么题都来个求导吧,它只是针对某类题更快的更简洁的求得答案而已。。。
我只是就题论题而已。。。。。。

[/Quote]
回复
linren 2009-08-30
8楼中的结果还是有问题:


可能是迭代法用的不对……
答案看上去应该在-1.3到-1.25之间……

等待高人来解答……
回复
linren 2009-08-30
【程序】
#include <stdio.h>
#include <math.h>

#define A 2.0

int main(){
double x1,x2;
x1=0;x2=-2.0;
}
printf("x = %f\n",x1);

return 0;
}

【结果】
x = -1.609438
Press any key to continue

【说明】
把迭代公式改了一下……
结果是7楼第一张图里小于零的解……
回复
linren 2009-08-30
[Quote=引用 6 楼 donkey301 的回复:]
引用 1 楼 litaoye 的回复:
x = 0?

应该还有一个小于零的解
[/Quote]0就像是万能钥匙一样……
当A=2时的确是有小于零的解……


3楼用迭代法得到的结果是:
x = 0.001413
Press any key to continue

现在对于这个结果产生了怀疑……

回复
qinguan0619 2009-08-30
[Quote=引用 12 楼 qinguan0619 的回复:]
直接两边求导。。。。
Python code1=-(-A/(1-AX)) (1-AX!=1)1-AX=A==> X=(1-A)/A

若1-AX=1;
X=0

python code:print"X1=0","X2=",(1-A)/A

[/Quote]
不好意思。。我弄错了。。。。我用matlab画了一下函数图。。。。。
楼上用图画出来的值跟我用matlab得出的结果差不多。。。
回复
linren 2009-08-30
[Quote=引用 19 楼 paradin 的回复:]
linren请问为什么要那样选初值?
[/Quote]
把这个恒等式x=-ln(1-Ax)
可以看成为两个函数……

f(x)=x
g(x)=-ln(1-Ax)

等式的解就是上面两个函数的图像中的线交叉的地方……

f(a)=g(a)时
x=a就是等式x=-ln(1-Ax)的解了……

迭代法算出的结果根据具体要求的精度……
得出的未必一定是正确的解

比如说7楼中的这张图:

程序认为0.001413就是等式的解了……

这是因为这两条线离的太近
它们之间的距离小于指定的误差时就会被误认为是正确解了……

于是想到了一点
如果存在解的话
f(a)=g(a)一定在某个地方交叉了……

也就是
x1<x2
f(x1)>g(x1)
f(x2)<g(x2)


x1<x2
f(x1)<g(x1)
f(x2)>g(x2)

这样的附近一定会有解……

这时侯再使用迭代法
就一定能找到符合精度的答案了……
回复
donkey301 2009-08-30
[Quote=引用 1 楼 litaoye 的回复:]
x = 0?
[/Quote]
应该还有一个小于零的解
回复
Paradin 2009-08-30
linren请问为什么要那样选初值?
回复
Paradin 2009-08-30
楼上结果验证是对的。
怎么还有两部求导的我晕。
回复
linren 2009-08-30
(上接16楼)

测试了一下A=32的情况……
得到的结果是:
x = -5.1013478342
Press any key to continue


用WZGrapher画图得到的结果是:
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告