用MATLAB做SOA数值模拟分析增益饱和特性,消光比特性,噪声比特性

用MATLAB做SOA数值模拟分析增益饱和特性,消光比特性,噪声比特性

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7720215
  • 这篇博客你也可以参考下:【优化算法】海鸥优化算法(SOA)【含Matlab源码 1099期】
  • 除此之外, 这篇博客: 用MATLAB实现雅克比迭代、高斯-赛德尔迭代以及超松弛迭代中的 5. 超松弛(SOR)迭代 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 超松弛迭代法实际是在高斯-塞德尔迭代的基础上的一个加速方法,可以看做是带参数的高斯-塞德尔迭代,是求解大型稀疏矩阵方程组的有效方法,有着很广泛的应用,其核心思想为将高斯-塞德尔迭代求解出的新的解向量元素与上一个解向量中相对应的元素,做加权平均组合成一个全新的解向量的元素,这个全新的解向量即为超松弛迭代法的解,其中的权重被称为松弛因子

    其具体计算公式如下:

    1. 用高斯-塞德尔迭代公式定义一个辅助量
      X~i(k+1)=1aii(bi−∑j=1i−1aijXj(k+1)−∑j=i+1naijXj(k))\widetilde{X}_{i}^{(k+1)}=\frac{1}{a_{ii}}(b_{i} - \sum\limits_{j = 1}^{i - 1}a_{ij}X_{j}^{(k+1)} - \sum\limits_{\mathop{j=i+1}}^{n}a_{ij}X_{j}^{(k)})Xi(k+1)=aii1(bij=1i1aijXj(k+1)j=i+1naijXj(k))
    2. Xi(k+1)X_{i}^{(k+1)}Xi(k+1)取做X~i(k+1)\widetilde{X}_{i}^{(k+1)}Xi(k+1)Xi(k)X_{i}^{(k)}Xi(k)的加权平均
      Xi(k+1)=(1−ω)Xi(k)+ωX~i(k+1)X_{i}^{(k+1)}=(1-\omega )X_{i}^{(k)} + \omega\widetilde{X}_{i}^{(k+1)}Xi(k+1)=(1ω)Xi(k)+ωXi(k+1)

      Xi(k+1)=(1−ω)Xi(k)+ωaii(bi−∑j=1i−1aijXj(k+1)−∑j=i+1naijXj(k))X_{i}^{(k+1)}=(1-\omega )X_{i}^{(k)} + \frac{\omega}{a_{ii}}(b_{i} - \sum\limits_{j = 1}^{i - 1}a_{ij}X_{j}^{(k+1)} - \sum\limits_{\mathop{j=i+1}}^{n}a_{ij}X_{j}^{(k)})Xi(k+1)=(1ω)Xi(k)+aiiω(bij=1i1aijXj(k+1)j=i+1naijXj(k))
      式中的系数ω\omegaω被称为松弛因子,当ω=1\omega = 1ω=1时即为高斯-塞德尔迭代,为了保证迭代过程收敛,要求 0<ω<20 < \omega<20<ω<2
      0<ω<10 < \omega<10<ω<1时,是低松弛法
      1<ω<21 < \omega<21<ω<2时,是超松弛法

    代码:

    x = zeros(1,n);
    y = zeros(1,n);
    count = 1;
    %中间变量
    x1 = zeros(1,n);
    x2 = zeros(1,n);
    %松弛因子w
    w = 1.3;
    
    while(1)
        x1(1:n) = 0;
        x2(1:n) = 0;
         for i = 1:n
            for j = 1: i-1
                x1(i) =x1(i) + A(i,j) * y(j);
            end
            for k = i + 1 : n
               x2(i) = x2(i) + A(i,k) * x(k); 
            end
            temp = (B(i) - x1(i) - x2(i))/A(i,i);
            y(i) = (1 - w)* x(i) + w * temp;
        end
        if max(abs(x-y)) < eps
            c = A * y';
            fprintf('迭代结束,次数%d,最终结果:\n',count);
            disp(y);
            disp(c);
            break;
        else
            fprintf('第%d次迭代结果:\n',count);
            disp(y)
        end
        if count == Nmax
            c = A * y';
            fprintf('超过最大迭代次数,迭代结束,最终结果:\n');
            disp(y);
            disp(c);
            break; 
        end
        count = count + 1;
        x = y;
    end
    

    仿真结果:
    在这里插入图片描述

你把数据发给我看一下