如何使用MATLAB数值求解未知嵌入积分的方程?

时间:2012-12-05 20:10:16

标签: matlab equation integral

我一直在尝试用MATLAB来解决这样的方程:

  

B = alpha * Y0 * sqrt(epsilon)/(pi * ln(b / a)* sqrt(epsilon_t))*积分来自   0到pi的   (2 * sinint(K0 * SQRT(ε-*(A ^ 2 + B ^ 2-2abcos(THETA)) - sinint(2 * K0 * SQRT(ε)* A * SIN(THETA / 2)) - sinint(2 * K0 * SQRT(ε)* b *表罪(希塔/ 2)))   关于theta

epsilon 是未知的。

我知道如何通过使用int()solve()来象征性地解决嵌入在积分中的未知方程式,但使用符号积分器int()对于这个复杂的方程需要太长时间。当我尝试使用quad()quadl()quadgk()时,我无法处理未知如何嵌入积分中。

1 个答案:

答案 0 :(得分:2)

这种事情变得非常复杂。尽管可以在单个内联方程中完成所有操作,但我建议您将其拆分为多个嵌套函数,只是为了便于阅读。

为什么可读性很重要的最好例子:你在发布的版本中有一个包围问题;没有足够的右括号,所以我不能完全确定数学符号中的等式是什么:)

无论如何,这是使用版本I的一种方法 - 思考 - 你的意思是:

function test

    % some random values for testing    

    Y0 = rand;
    b  = rand;
    a  = rand;
    k0 = rand;
    alpha     = rand;
    epsilon_t = rand;

    % D is your B
    D = -0.015;

    % define SIMPLE anonymous function 
    Bb = @(ep) F(ep).*main_integral(ep) - D;

    % aaaand...solve it!
    sol = fsolve(Bb, 1)

    % The anonymous function above is only simple, because of these: 

    % the main integral    
    function val = main_integral(epsilon)

        % we need for loop through epsilon, due to how quad(gk) solves things
        val = zeros(size(epsilon));
        for ii = 1:numel(epsilon)

            ep = epsilon(ii);

            % NOTE how the sinint's all have a different function as argument:
            val(ii) = quadgk(@(th)...
                2*sinint(A(ep,th)) - sinint(B(ep,th)) - sinint(C(ep,th)), ...
                0, pi);            
        end

    end

    % factor in front of integral
    function f = F(epsilon)        
        f = alpha*Y0*sqrt(epsilon)./(pi*log(b/a)*sqrt(epsilon_t)); end

    % first sinint argument
    function val = A(epsilon, theta)
        val = k0*sqrt(epsilon*(a^2+b^2-2*a*b*cos(theta))); end

    % second sinint argument
    function val = B(epsilon, theta)
        val = 2*k0*sqrt(epsilon)*a*sin(theta/2); end

    % third sinint argument
    function val = C(epsilon, theta)
        val = 2*k0*sqrt(epsilon)*b*sin(theta/2); end    

end

上面的解决方案仍然会很慢,但我认为这对于这种复杂的积分来说非常正常。

我不认为实现你自己的sinint会有多大帮助,因为大多数速度损失都是由于带有非内置函数的for循环...如果你想要它的速度,我会去使用您自己的Gauss-Kronrod自适应正交程序实现MEX。