超越方程的数值求解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

对于单一解的简单方程,我们可以使用fsolve直接求解,当我们碰到多支解的超越方程,直接使用fsolve,运行结果往往并不理想。我们分享一种求解超越方程的数值方法,并且展示MATLAB代码和运行结果。此外,欢迎交流效率更高的算法。

一、方法

求解超越方程,形如 f ( x ) = 0 , f(x)=0, f(x)=0(1)用数值方法初筛出一系列接近零点的解,按照大小排序分类,挑选出最接近零点的值;
(2)在此解附近取初筛精度的间距,加密细筛零点解;
(3)细筛出的零点解作为初始值,使用fsolve求解。

二、示例:代码和结果

这里我就不把示例中的超越方程公式敲出来了,所有必要的代码注释都在程序中,自行理解。

%输入参数
L_lambda_p=0.04;
options=optimoptions("fsolve","Algorithm","trust-region");

%定义要求解的方程 f=0
f=@(K_para,Omega) 1-(sqrt(1-1./(Omega.^2-K_para.^2))-(1-1./Omega.^2)).^2./(sqrt(1-1./(Omega.^2-K_para.^2))+(1-1./Omega.^2)).^2.*exp(2j*2*pi.*sqrt(Omega.^2-K_para.^2).*L_lambda_p);

%求解
Omega=0.0002:0.0005:1.2002;Y={};
for K_para=0:0.1:20
    %初筛选
    Dispersion=@(Omega)f(K_para,Omega);
    Omega_scatter=Dispersion(Omega);
    [g_scatter,index]=sort(abs(Omega_scatter));   %选取函数绝对值从小到大排序
    Omega_index=Omega(index(1:8));   %取函数绝对值最小的几个频率取值
    Omega_index=sort(Omega_index);   %对第一次筛选出来的频率值从小到大排序
    c=1;C={};count=1;   %数有多少相邻取值区域
    for i=2:length(Omega_index)
        if Omega_index(i)-Omega_index(i-1)>=0.00051   %第一次筛选出来的频率取值不相邻判据
            C=[C,Omega_index(c:i-1)];   %把相邻的频率值以数组形式放进Cell里
            c=i;
            count=count+1;
        end
    end
    C=[C,Omega_index(c:length(Omega_index))];

    % 细筛选
    Y_index2=[];   %第二次筛选值
    for i=1:count
        D=C{i};   %从Cell中从小到大取出连续数组
        Omega_scatter2=Dispersion(D);
        [g_scatter2,index2]=sort(abs(Omega_scatter2));
        Omega_index2=D(index2(1));
        Y_index2=[Y_index2,Omega_index2];
    end

    %fsolve精确求解
    Omega_K_para=fsolve(Dispersion,Y_index2,options);   %对第二次筛选值求解【数组】
    Y=[Y,Omega_K_para];
end

%处理求解结果
for j=1:length(Y)
    Y{j}=real(Y{j});
end
Y_TM_p=Y;
% save("TM_004.mat","Y_TM_p")

结果:

% plot
K_para=0:0.1:20;
for i=1:length(Y_TM_p)
    y=transpose(Y_TM_p{i});
    scatter(K_para(i),y,"red","filled","SizeData",14);
    hold on
end
xlabel(gca,"$ck_\parallel/\omega_p$","Interpreter","latex","FontName","Times New Roman","FontSize",14)
ylabel(gca,"$\omega/\omega_p$","Interpreter","latex","FontName","Times New Roman","FontSize",14)
set(gca,"FontName","Times New Roman","FontSize",14,"Box","on","TickLength",[0.025,0.025],"XMinorTick","on","YMinorTick","on")
axis([-0.5,20.5,-0.05,1.05])

在这里插入图片描述

总结

我们提供一种数值求解超越方程的方法。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab求解超越方程可以使用fsolve函数。但是fsolve只能求解一组给定初值的,如果要求多个根,可以先用Mathematica画图,观察得到零点个数和大概位置,然后再调用fsolve求解。 对于你提到的超越方程'0=(r^2 (50*m*(2*pi*k*C)^2))*tanh(r*0.04) i*r*(50-m)*2*pi*k*C',如果你只得到了0作为,而实际情况应该有复数根,可能是由于初始值选择不当导致的。你可以尝试使用不同的初始值来调用fsolve函数,以寻找正确的复数。 另外,你提到有人使用其他代码得到了正确的复数,但你不理那是什么语言。如果你能提供那段代码,我可以帮助你读它并在Matlab中实现。 同时,你还提供了一个root2d.m文件,里面定义了一个要求解方程组。如果你想在Matlab求解这个方程组,可以直接调用fsolve函数,将root2d函数作为输入参数传入。 综上所述,你可以尝试以下步骤来在Matlab求解超越方程: 1. 调用fsolve函数,选择合适的初始值,求解超越方程。 2. 如果fsolve无法得到正确的复数,尝试其他初始值。 3. 如果你有其他人使用的代码,可以提供给我,我可以帮助你读并在Matlab中实现。 4. 如果你有其他方程组要求解,可以使用fsolve函数并将对应的方程组函数作为输入。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Matlab数值求解超越方程的根](https://blog.csdn.net/Yangjing6545/article/details/101584545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [matlab超越方程的复数根](https://blog.csdn.net/weixin_39977934/article/details/115852702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值