不清楚"关键是怎样同时算出多于一个的根"的意义?:@L
太数学的东西, 对于老小工的我, 有点难过!
我想真正需要无水来救我了!:loveliness: 1.这个方程有无穷多个解
2.数值方法,只能一个一个找
3.如果想找到多个解,那么用地毯式搜索,然后将明显不同的解挑出来
回复 15楼 VibrationMaster 的帖子
不知道您看我的附件没有,对应每一个参数(比如上面的0.25),我只需要前面的三个解。不知道您说的“地毯式搜索”具体怎么操作?:@) 将fsolve的初值从可能区间以很小间隔走一遍得到很多个解。然后将靠近的解合并 如果区间是一维的话,根据你的提示,我应该能做。但是区间现在是二维的,我就不知道怎么做了。:@)回复 17楼 VibrationMaster 的帖子
刚才我点的“发表新回复”,回复在18楼,其实就是回复你的。见谅见谅:@) 两个方向都搜,如同排雷。初值 c= a+b*j,用两重循环。运算量大一些,但是应该还是能够忍受的。 如果实在忍受不了,那就只能分析方程的特性,界定可能解的范围。对于没有解析解的非线性问题,指望计算机一劳永逸地用迭代法解出,而不做人为干预是不可能的。 高手和初学者的差别仅在于前者的干预度小一些。 这帖建议关闭并与此帖合并!
http://forum.vibunion.com/forum/viewthread.php?tid=89196&highlight= 综合了各位大侠的意见,对这个方程进行了分析,方程的解实部和虚部有一定的关系,所以选初值只选一个,这样就变成一重循环,运算起来速度会好一些。
clc
clear
% a从3.3开始; % 保证 (exp(a)+exp(-a))^2-64*a^2>0
% b=(exp(a)-exp(-a))^2*((exp(a)+exp(-a))^2-64*a^2)/64/(exp(a)+exp(-a))^2;
% x0=;
s=[];
for a=3.3:.1:10
b=(exp(a)-exp(-a))^2*((exp(a)+exp(-a))^2-64*a^2)/64/(exp(a)+exp(-a))^2;
b=sqrt(b);
x0=;
y=fsolve(@myfun,x0);
x=y(1)+y(2)*i;
xx=x*i/sinh(x)-.25;
if (abs(real(xx))<1e-5) && (abs(imag(xx))<1e-5)
s=;
end
end
% 剔除重复的解
ind=diff(s);
ss=s(1);
for m=1:length(ind)
if abs(ind(m))>1e-3
ss=;
end
end
子函数
function f=myfun(x)
f=[cos(x(2))*(exp(x(1))-exp(-x(1)))+8*x(2);
sin(x(2))*(exp(x(1))+exp(-x(1)))-8*x(1)];
运算结果(注意:b=-sqrt()暂时未考虑,lz可以算一下):
>> length(ss)
ans =
48
>> max(abs(ss*i/sinh(ss)-.25))
ans =
1.9185e-015
回复 22楼 friendchj 的帖子
非常感谢您的回复。这段时间实验室事情比较多,虽然天天都来看看帖子,但是都没有仔细再分析过那个方程。
放假回家我会认真看看您的程序的。
祝您新年快乐。也祝论坛的各位朋友新年快乐。非常感谢大家。:@)
页:
1
[2]