声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3385|回复: 6

[编程技巧] fzero函数求单变量非线性方程含多个解的问题

[复制链接]
发表于 2009-9-6 17:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
用fzero求解一个非线性方程多个解的问题
x=0.01
for w=linspace(3\2*x+0.01,1,10)
        b=fzero('fz',w);
        W=[W,b];
    end

调用的函数为:function f=fz(y)
f=cos(Fa)*cos(Fb)-2\(y1/y2+y2/y1)*sin(Fa)*sin(Fb)-cos(1);
其中Fa、Fb、y1、y2均为Fa=2*pi*(n1^2*(y^2)-x^2)^(1/2)*d1/3;
Fb=2*pi*(n2^2*y^2-x^2)^(1/2)*d2/3;除了y以外的其他字符均为常数

Exiting fzero: aborting search for an interval containing a sign change
    because complex function value encountered during search.
(Function value at 0.0060012 is 0.63721-0.00051465i.)
Check function or try again with a different starting value.
ans=Nan
当y值取的过小时就会出现这种情况,而函数在此时没有解是可能的(此函数在0-1内有多个解)哪位大侠知道如何避免啊或者有什么命令可以使程序运行到此时自动退出fzero函数接着进行下一步而不出现如上的提示啊
因为要进行很多调用,会出现上百个上面的东西。
万分感谢啊!!!!!!
回复
分享到:

使用道具 举报

发表于 2009-9-7 20:51 | 显示全部楼层
看不清楚LZ调用的函数是什麽?
linspace(3\2*x+0.01,1,10)及2\(y1/y2+y2/y1)*sin(Fa)*sin(Fb)的倒除号没错吧! 很少看如此使用! 3\2=2/3楼主知道吧!
 楼主| 发表于 2009-9-7 21:16 | 显示全部楼层
global x
a=1;
    for x=0:0.01:1
        W=[];
        for w=linspace(3\2*x+0.02,1,10)%这里3\2*x加上一个数是为了使Fa、Fb不为虚数;
            b=fzero('fz',w);
             W=[W,b];
        end
        omega1{a}=W;
        a=a+1;
    end
调用的函数为
function f=fz(y)
%调用fzero命令求解非线性方程中的函数文件自变量是频率(y);
%用于数值求解色散关系方程中的频率w即y(在K和切向波矢kx-即x给定情况下);
%thetal     在介质一中的入射角其他的比如thetal2类比;
%这里y和x均为归一化的结2果(即除以了2*pi/Lambda)lambda不是波长而是周期长;
%2009.9.4;
global x
n1=2.4;n2=1.5;d1=1.5;d2=d1;
theta1=asin(sin(pi/4)/n1);
theta2=asin(sin(theta1)*n1/n2);
y1=(8.854*10^(-12)/(4*pi*10^(-7)))^(1/2)*2.4*cos(theta1);
y2=(8.854*10^(-12)/(4*pi*10^(-7)))^(1/2)*1.5*cos(theta2);%数字不同于字符,尽管定义相
Fa=2*pi*(n1^2*(y^2)-x^2)^(1/2)*d1/3;Fb=2*pi*(n2^2*y^2-x^2)^(1/2)*d2/3;
f=cos(Fa)*cos(Fb)-2\(y1/y2+y2/y1)*sin(Fa)*sin(Fb)-cos(1.2);
注:3\2*x肯定是没错,当然也可以写成1.5*x,都一样,现在问题主要就是fzero函数由于可能没有解造成的退出老是出现在屏幕上很多

[ 本帖最后由 lxy04123 于 2009-9-7 21:21 编辑 ]
发表于 2009-9-7 23:46 | 显示全部楼层
 楼主| 发表于 2009-9-8 09:51 | 显示全部楼层
哦,那个我一时粗心写错了,是3\2*x或者2*x/3,原程序没错,还望哪位大哥帮帮忙指点一下,小弟也是初学者啊
发表于 2009-9-8 15:06 | 显示全部楼层
个人水平专业有限, 仅能就编程提意见!
fzero仅针对实函数求解, 对复函数是不行的; 所以LZ应先自行判断所用函数是否为实函数, 若不是就不应该使用fzero求解, 若是就需检查下为何出现复数!
实函数吗? 出现复数的地方为Fa/Fb造成, 即开根号(n1^2*(y^2)-x^2)^(1/2)里头为负数, 需不需取绝对值!?
改成下式是没报警的, 但应该如何LZ定夺!
Fa=2*pi*sqrt(abs(n1^2*y^2-x^2))*d1/3; Fb=2*pi*sqrt(abs(n2^2*y^2-x^2))*d2/3;
 楼主| 发表于 2009-9-8 20:13 | 显示全部楼层
谢谢您的提醒,不过绝对值符号不能随便加,因为这里的符号都是有物理含义的,我猜是由于fzero 的问题,因为我设定用fzero进行搜索的初值仅仅刚刚满足使Fa和Fb为正的,而fzero所采用的是基于二分法和牛顿迭代法(好像是)给定初值后可能会从比初值小的值开始,而这个值很可能使Fa和Fb由于对负值开方产生错误,如果增大一些w(既搜索初值)可以减少警告的出现。 也许是我的算法本身就有问题,在改一改把,
感谢主任的热心帮助!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-17 05:05 , Processed in 0.049045 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表