用Matlab解决超越方程

时间:2018-01-06 13:20:21

标签: matlab equation

我有一个如下所示的等式: enter image description here

这里,I_L(lambdap)是修改过的bessel函数。这个和具有指数函数的乘积可以用matlab编写为besseli(L,lambdap,1)。 “i”代表-1的平方根。我想解决:

  

1 + PT +它= 0

我必须改变'k'并找到'w'的值。我在mathematica stack exchange发布了类似的问题,但我无法完全解决问题,但我有一个clue (请在{{3}处查看评论})。我无法将公式转换为mathematica stack exchange site中发布的代码。在此方面的任何帮助将受到高度赞赏。

提前致谢...

1 个答案:

答案 0 :(得分:0)

我之前从未尝试过这种方法,但是......这会返回一个合适的结果吗?

syms w k;
fun = 1 + pt(w,k) + it(w,k);
sol = vpasolve(fun == 0,w,k);

disp(sol.w);
disp(sol.k);

function res = pt(w,k)
    eps_l0 = w / (1.22 * k);
    lam_k = 0.25 * k^2;

    res = sym('res',[5 1]);
    res_off = 1;

    for L = -2:2
        gam = besseli(L,lam_k) * exp(-lam_k);
        eps_z = (w - L) / (1.22 * k);
        zeta = 1i * sqrt(pi()) * exp(-eps_z^2) * (1 + erfc(1i * eps_z));

        res(res_off,:) = ((25000 * gam) / k^2) * (1 + (eps_l0 * zeta));
        res_off = res_off + 1;
    end

    res = sum(res);
end

function res = it(w,k)
    eps_l0 = (w - (0.86 * k)) / (3.46 * k);
    lam_k = 0.03 * k^2;

    res = sym('res',[5 1]);
    res_off = 1;

    for L = -2:2
        gam = besseli(L,lam_k) * exp(-lam_k);
        eps_z = (w - (8 * L) - (0.86 * k)) / (3.46 * k);
        zeta = 1i * sqrt(pi()) * exp(-eps_z^2) * (1 + erfc(1i * eps_z));

        res(res_off,:) = ((2000000 * gam) / k^2) * (1 + (eps_l0 * zeta));
        res_off = res_off + 1;
    end

    res = sum(res);
end

修改

对于数字k和符号w:

syms w;

for k = -3:3
    fun = 1 + pt(w,k) + it(w,k);
    sol = vpasolve(fun == 0,w);
    disp(sol.w);
end