1

我正在尝试fsolve在 matlab 中使用数值求解非线性方程组。这是我的程序的测试样本,k1R参数,x0是起点。

function y=f(k1, R, x0)

pair=fsolve(@system,x0);

y=pair(1);

    function r=system(v)

        int1=@(x) exp(k1*x);
        int2=@(x) exp(k1*x^2)/(x^4);


        r(1)=exp(v(1))*quadl(int1,0,v(1));     
        r(2)=exp(k1*v(2))*quadl(int2,v(1),20)*k1*R;

    end

end

奇怪的是,当我运行这个程序时,matlab 一直告诉我应该使用.^而不是^in int2=@(x) exp(k1*x^2)/(x^4)。我很困惑,因为该x函数句柄在被quadl. 为什么我必须.^在这种情况下使用?

此外,我看到在线文档中提供的许多示例也使用了.^,即使它们显然具有标量的功能,如这里。谁能帮忙解释一下为什么?

提前致谢。

4

2 回答 2

2

在内部,MATLAB 将评估函数fun的必要值x,该值大于一个并且x是一个向量。a并且b仅用于描述积分的极限。从文档

fun 是一个函数句柄。它接受向量 x 并返回向量 y,函数 fun 在 x 的每个元素处求值。限制 a 和 b 必须是有限的。

因此,您必须使用.^对 vector 的各个元素进行操作x

于 2012-10-24T13:23:53.780 回答
2

int2您使用矩阵幂 ( ^) 的函数中,您应该使用逐元素幂 ( .^)。此外,您使用了矩阵右除法 ( /),您应该使用逐元素除法 ( ./)。这是必要的,因为(和朋友)出于效率的原因将一次评估整个数组quadl的被积函数。int2x

所以,使用这个:

function y = f(k1, R, x0)

    pair = fsolve(@system,x0);

    y = pair(1);

    function r = system(v)

        int1 = @(x) exp(k1*x);
        int2 = @(x) exp(k1*x.^2)./(x.^4);

        r(1) = exp(   v(1)) * quadl(int1,0,v(1));     
        r(2) = exp(k1*v(2)) * k1*R*quadl(int2,v(1),20);

    end

end

另外,请查看quadgkintegral(如果您使用的是较新的 Matlab)。

顺便说一句,我假设您的实际功能是不同的功能吗int1int2因为这些函数对于解析求解当然是微不足道的......

于 2012-10-24T13:27:27.057 回答