shuidixn 发表于 2012-9-8 10:51

三元一次方程的求解

我的方程如Fig1然后我用fsolve求解:
clc
clear
a=1.86e-26;
b=125.4;
c=1.76e-25;
% y0=x+1+10.*(1-a.*x).*x./((1-a.*x).^2+(b+c.*x).^2);
y1=fsolve(@(x)x+1+10.*(1-a.*x).*x./((1-a.*x).^2+(b+c.*x).^2),-1)

结果命令窗口出现:

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>


y1 =

   -0.9994

估计这个y1值肯定是不对的,我这个函数是不是不能用fsolve来解?

ChaChing 发表于 2012-9-8 22:10

shuidixn 发表于 2012-9-8 10:51 static/image/common/back.gif
我的方程如Fig1然后我用fsolve求解:
clc
clear


水平有限, 仅只工程判断
假设x在零附近求解
a=1.86e-26 => ax<<1 => 1-ax~=1
b=125.4; c=1.76e-25 => b+cx~=b
=> (1-ax)^2+(b+cx)^2 ~= 1+b^2 ~=b^2
10(1-ax)x/((1-ax)^2+(b+cx)^2) ~= 10x/b^2 ~=0
也就是说x~=-1, 难道LZ需要精确度很高吗

VibrationMaster 发表于 2012-9-9 08:46

数值求解还是对量级相当的数操作比较好,一看您的a,b,c相差那么大,数值结果不理想很正常,建议对数据作变换,或者归一化之后再求解

shuidixn 发表于 2012-9-9 11:37

回复 2 # ChaChing 的帖子

哦,错了,一元三次。x的值是在[-1,1]这个范围之间,后来我试了
y2=fzero(@(x)x+1+40*8/3.*x./(1+(b+a.*x).^2),[-1,1])

y2 =

   -0.9933

按理说,3次方程有3个根,我plot了一下这个方程,发现基本是条直线,与x轴只有一个交点,所以觉得里面还是有点儿小问题?

shuidixn 发表于 2012-9-9 11:40

回复 3 # VibrationMaster 的帖子

多谢指点。再问下,
变换是指类似于两边同取log这样吗?
归一化这个不是很理解?

VibrationMaster 发表于 2012-9-9 18:12

回复 5 # shuidixn 的帖子

1. 三次方程有三个复根,看图只能检查实根过零,看不到复根
2. 我所说的变换:因为根与-1非常接近,如果引如新变量 y=x+1,然后求解y可能更好; 如果有可能,在引入 z=afa y, 选择afa 使新的a b,c 大小接近, 等等
3. 你的方程可以变成一元三次方程, 解一元三次方程比你的分式方程容易一些
页: [1]
查看完整版本: 三元一次方程的求解