回 帖 发 新 帖 刷新版面

主题:求教非线性方程组解法

我编写一段求解非线性方程组的程序,怎么也调试不下去啦,前来请教各位
不胜感激!!!!
下面是全部代码,当然QB和QA是我挑出一个比较简单的非线性方程组来进行验证用的
应景做不下去了,说雅克比矩阵接近于奇异或变质矩阵
function snow_whzh
x_y=sym('[q2;q3]');
QB=sym('[0.4*cos(q2)+0.3*cos(q3);0.4*sin(q2)+0.3*sin(q3)]');
QA=sym('[-cos(pi/4)+0.4;-sin(pi/4)+0.1]');

%q=snow_NR(Q,A,q)
x_y=local_NR(QB,QA,x_y)

function A=snow_jocabi(B,q)
%求约束方程的雅可比矩阵
[n,NA]=size(B);
m=length(q);
for i=1:n
    for j=1:m
        A(i,j)=diff(B(i),q(j));
    end
end

function a=snow_norm(H)
%计算向量或者矩阵的无穷范数
[n,m]=size(H);
b=[0];
for i=1:n
    for j=1:m
        b(i,j)=0;
    end
end
for i=1:n
    for j=1:m
        %c=abs(H(i,j));
        b(i)=b(i)+abs(H(i,j));  
    end
end
a=b(1);
for i=2:n
    if b(i-1)<b(i)
        a=b(i);
    end
end

function q=snow_NR(Q,A,y)
%用迭代法求解非线性方程组
%x=numeric(x);
%n=length(x);
%Qx=snow_jocabi(Q,x);
kk=0;
function q=inline_snow_NR(Q,A,x,kk)
    n=length(x);
    Qx=snow_jocabi(Q,x);
    for i=1:n
        u(i)=kk;
    end
    for i=1:1.0e+5
        QQ=subs(Q,x(1),u(1));
        for j=2:n
        QQ=subs(QQ,x(j),u(j));
        end
        %QQ=numeric(QQ);
        Qxx=subs(Qx,x(1),u(1));
        for j=2:n
            Qxx=subs(Qxx,x(j),u(j));
        end
        %Qxx=numeric(Qxx);
        B=QQ-A;
        u0=Qxx\B;    %求解线形方程组
        disp(u);
        for j=1:n
            u_1(j)=u(j)+u0(j);        
        end
        u=u_1; 
        disp(u);
        B=numeric(B);        %将QQ-A转换成数值型 
        b_norm=snow_norm(B);  %计算QQ-A的无穷范数
        u0=numeric(u0);         %将u0转换成数值型
        u0_norm=snow_norm(u0);   %计算u的无穷范数
        if (b_norm<1.0e-6)&(u0_norm<1.0e-6)
            %u=nemeric(u);
            q=u;
            return;
        end
        [xx,yy]=size(QQx);
        if (rank(QQx)<yy)&(b_norm>1.0e-6)
            kk=kk+1;          %如果雅可比矩阵奇异并且Q-A不等于0时
            q=inline_snow_NR(kk);  %返回到inline_snow_NR,对u重新估值
        end
               
    end
end  % end  function in_local_NR(j)

p=inline_snow_NR(Q,A,y,kk);
q=p;
end   % end function x=local_NR1(Q,A,x)


function q=local_NR(Q,A,y)
%用N-R法求解非线性方程组
%x=numeric(x);
%n=length(x);
%Qx=snow_jocabi(Q,x);
kk=1;
p=inline_snow_NR(Q,A,y,kk);
q=p;

function q=inline_snow_NR(Q,A,x,kk)
%x=numeric(x);
    n=length(x);
    Qx=snow_jocabi(Q,x);
    for i=1:n
        u(i)=kk/10;
    end
    u=u';
    for i=1:1.0e+5
        QQ=subs(Q,x(1),u(1));
        for j=2:n
        QQ=subs(QQ,x(j),u(j));
        end
        QQ=numeric(QQ);
        Qxx=subs(Qx,x(1),u(1));
        for j=2:n
            Qxx=subs(Qxx,x(j),u(j));
        end
        Qxx=numeric(Qxx);
        disp(Qxx);
        A=numeric(A);
        B=QQ-A;
        disp(B);
        u0=Qxx\B;    %求解线形方程组   
        disp('u=');
        disp(u);
        disp('u0=');
        disp(u0);        
        u=u+u0;
        %for j=1:n
         %   u(j)=u(j)+u0(j);        
         %end
        %u=u_1; 
        disp('u=');
        disp(u);
        B=numeric(B);        %将QQ-A转换成数值型 
        b_norm=snow_norm(B);  %计算QQ-A的无穷范数
        u0=numeric(u0);         %将u0转换成数值型
        u0_norm=snow_norm(u0);   %计算u的无穷范数
        if (b_norm<1.0e-6)&(u0_norm<1.0e-6)
            %u=nemeric(u);
            q=u;
            return;
        end
        Qxx=numeric(Qxx);
        %[xx,yy]=size(Qxx);
        if (det(Qxx)<1.0e-16)&(b_norm>1.0e-6)
            kk=kk+1;          %如果雅可比矩阵奇异并且Q-A不等于0时
            q=inline_snow_NR(Q,A,x,kk);  %返回到inline_snow_NR,对u重新估值
        end
               
    end
    %end  % end  function in_local_NR(j)

回复列表 (共16个回复)

11 楼

===============================================
就像你的方法把,雅克比矩阵总是接近于奇异,该咋办呢?是不是雅克比矩阵奇异方程组就一定无解
===============================================
基于Newton法的思想,确实如此!
至于其他方法,查询中!
你说的那个EXE文件能否好给我瞧瞧?

12 楼

感谢Guassfans给我们提供的程序!!

我还想向你请教下
我遇到的问题也是要求解2个非线形方程,可是我的解会出现不只1个根,
不知道非线性方程组之Newton法 能不能求出多个根的,如果能请帮我一下。
这个问题已经捆饶我好久了。谢谢

13 楼

上边的程序是一定不能的,你能看出,Newton法是由给出的初始解搜索比较精确解的.
求出多个根的程序我也没有尝试过.

14 楼

[quote]怎样弄能看到exe文件的源代码阿?[/quote]

你说怎么搞反汇编得了!

15 楼

[quote]===============================================
就像你的方法把,雅克比矩阵总是接近于奇异,该咋办呢?是不是雅克比矩阵奇异方程组就一定无解
===============================================
基于Newton法的思想,确实如此!
至于其他方法,查询中!
你说的那个EXE文件能否好给我瞧瞧?
[/quote]

我把那个文件发到你的邮箱里了
谢谢你啊!!!

16 楼


请教上面两位,在guassfans给出的程序里,x0是一个未知数,还是可以定义为一组未知数的向量?
上面那段程序可以用来解2个未知数,多个方程的非线性方程组吗?

我现在问题如下:
有如下方程组:
r=f(x)+n
r={d21;d31;.....dk1;tan(p)}  k*1维
f(x)={d2-d1;d3-d1;....dk-d1;(y-y1)/(x-x1)}   k*1维
n为干扰值, k*1维
其中d1,d2,d21等均为距离,d1表示标准点1(x1,y1)到待求点(x,y)的距离,d21=d2-d1,为距离差
p为已知角度,标准点1--k座标已知

以上为一多维非线性方程组,未知数(x,y)两个,方程k个


恳请大家帮忙,非常感谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册