如何利用MATLAB数值求解积分中含有未知项的方程?

如何利用MATLAB数值求解积分中含有未知项的方程?,matlab,equation,integral,Matlab,Equation,Integral,我一直在尝试使用MATLAB来求解如下方程: B=α*Y0*sqrt(ε)/(pi*ln(B/a)*sqrt(εt))*从 0到π的 (2*sinint(k0*sqrt(ε*(a^2+b^2-2abcos(θ))-sinint(2*k0*sqrt(ε)*a*sin(θ/2))-sinint(2*k0*sqrt(ε)*b*sin(θ/2))) 关于θ 其中ε是未知的 我知道如何使用int()和solve()以符号方式解积分中包含未知项的方程,但是使用符号积分器int()对这样复杂的方程来说花费太长

我一直在尝试使用MATLAB来求解如下方程:

B=α*Y0*sqrt(ε)/(pi*ln(B/a)*sqrt(εt))*从 0到π的 (2*sinint(k0*sqrt(ε*(a^2+b^2-2abcos(θ))-sinint(2*k0*sqrt(ε)*a*sin(θ/2))-sinint(2*k0*sqrt(ε)*b*sin(θ/2))) 关于θ

其中ε是未知的


我知道如何使用
int()
solve()
以符号方式解积分中包含未知项的方程,但是使用符号积分器
int()
对这样复杂的方程来说花费太长时间。当我尝试使用
quad()
quadl()
quadgk()时
,我很难处理未知如何嵌入积分中。

这类事情变得非常复杂。虽然可以在一个内联方程式中完成所有工作,但我建议您将其拆分为多个嵌套函数,即使只是为了可读性

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

不管怎样,这里有一种方法来处理这个版本,我想你的意思是:

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。

是上面定义的所有其他常量(即alpha、Y0等)这些常数只是用于计算的任意常数,只有ε是未知的。θ只是积分变量(如dx、dy、dz等)