当前位置: 首页 > 有奖问答 >非线性方程组的迭代法(数值计算高手请进)

非线性方程组的迭代法(数值计算高手请进)

作者 houbing
来源: 小木虫 350 7 举报帖子
+关注

我在用matlab求解一组非线性方程组的时候遇到了困难,因为初值选择不合适,迭代几乎都不收敛,由于数据量较大,没有办法对每个初值进行调整,有没有一种迭代算法可以对初值没有要求,我目前使用的是几个教科书上的算法,牛顿法,不动点迭代,弦割法。期待有高手可以指点迷津,先行谢过! 返回小木虫查看更多

今日热帖
  • 精华评论
  • gaofeng925

    对初值都要有要求

  • lgm19851116

    我个人认为是你的迭代方法造成的。

    因为是电脑计算,不用考虑计算量,可以选用收敛速度小的方法。一般结果较好。

    如果你的变量很多,确实比较难办。

    建议先估算出其中几个变量的大致范围。

  • houbing

    引用回帖:
    Originally posted by lgm19851116 at 2010-05-19 10:12:08:
    我个人认为是你的迭代方法造成的。

    因为是电脑计算,不用考虑计算量,可以选用收敛速度小的方法。一般结果较好。

    如果你的变量很多,确实比较难办。

    建议先估算出其中几个变量的大致范围。

    我有5个变量,五个方程,都是复变的,其中包括bessel方程,看来我还是得好好研究一下变量的初值了,谢谢您的回复:)

  • houbing

    为了方便向大家请教,我把我的程序贴了出来,第一次使用matlab,对着手册编了一周,有不够简洁的地方还望见谅:)

    基本问题就是求解kesai afa gama J0afa J1afa J0gama J1gama(分别为afa gama的零阶和一阶bessel函数)七个变量的非线性方程组;共有5328个数据点,每个点都需要求解这样一个方程组,初值只给了kesai的初值,其它变量有显式的关系可以通过kesai求解,实际上是利用迭代法求fkesai=0;

    j=1,j=2都是收敛的,j=3就不收敛了

    % 不动点迭代
    %define constant
    clear;
    E=3000000000;
    rou=1200;
    K=2500000000;
    a=0.015;
    ita=1000000;
    sampling_rate=10000000;
    f=(1:5238)*sampling_rate/5238;
    im=i;
    %calculate parameters
    for j=1:5238
    Estar(j)=-im*E*ita*f(j)/(E-im*ita*f(j));
    end
    for j=1:5238
    kesai0(j)=sqrt(rou*f(j)^2/Estar(j));
    end
    for j=1:5238
    miu(j)=3*K*f(j)*ita*im/(9*K*(1+im*f(j)*ita/E)-im*f(j)*ita);
    lamda(j)=K-2/3*miu(j);
    end
    %initial value of variables
    for j=1:5238
    kesai(j)=kesai0(j);
    afa(j)=sqrt(rou*f(j)^2/(lamda(j)+2*miu(j))-kesai(j)^2);
    gama(j)=sqrt(rou*f(j)^2/miu(j)-kesai(j)^2);
    J0afa(j)=besselj(0,afa(j)*a);
    J1afa(j)=besselj(1,afa(j)*a);
    J0gama(j)=besselj(0,gama(j)*a);
    J1gama(j)=besselj(1,gama(j)*a);
    fkesai(j)=2*afa(j)/a*(gama(j)^2+kesai(j)^2)*J1afa(j)*J1gama(j)-(gama(j)^2-kesai(j)^2)*J0afa(j)*J1gama(j)-4*kesai(j)*afa(j)*gama(j)*J1afa(j)*J0gama(j);
    j
    %iterative
    n=1;
    while abs(fkesai(j))>0.0001&(n<=10000)
    %不动点迭代from fkesai=0
    kesai(j)=(2*afa(j)/a*(gama(j)^2+kesai(j)^2)*J1afa(j)*J1gama(j)-(gama(j)^2-kesai(j)^2)*J0afa(j)*J1gama(j))/(4*afa(j)*gama(j)*J1afa(j)*J0gama(j));
    afa(j)=sqrt(rou*f(j)^2/(lamda(j)+2*miu(j))-kesai(j)^2);
    gama(j)=sqrt(rou*f(j)^2/miu(j)-kesai(j)^2);
    J0afa(j)=besselj(0,afa(j));
    J1afa(j)=besselj(1,afa(j));
    J0gama(j)=besselj(0,gama(j));
    J1gama(j)=besselj(1,gama(j));
    fkesai(j)=2*afa(j)/a*(gama(j)^2+kesai(j)^2)*J1afa(j)*J1gama(j)-(gama(j)^2-kesai(j)^2)*J0afa(j)*J1gama(j)-4*kesai(j)*afa(j)*gama(j)*J1afa(j)*J0gama(j);
    n=n+1;
    abs(fkesai)
    end
    end,

  • hxz0407

    我觉得不管什么计算方法都是需要一个合适的初值的,特别是这么多的方程和变量,另外合适的步长也很重要,可以适当调下步长,步长未必越小越好,因为本来就是数值计算,迭代速度最快的可以看下数值计算里面的几个方法,还有一个牛顿下山法等的。

  • hxz0407

    你说的对,迭代法没有取步长的问题,有收敛速率快慢的问题,取步长是二分法的

  • dingd

    1stOpt不需要初值,很强大方便,可以试试!

猜你喜欢
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓