回 帖 发 新 帖 刷新版面

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

我编写一段求解非线性方程组的程序,怎么也调试不下去啦,前来请教各位
不胜感激!!!!
下面是全部代码,当然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个回复)

沙发

不错!不错!
不知道你有何麻烦
可用fsolve做验证

板凳

祈求指点!

3 楼


咋没人理我啊,敬请高手指点,非常非常谢谢!!!

4 楼

帮你写一个得了,你等着呀!

5 楼

万分感谢!!!

6 楼

哇,高手中的高手啊!

7 楼

function x=Newtons(fun,x0)
%求解非线性方程组之Newton法
%fun(X)包含两部分内容:函数向量F(X)为所要求根的方程组;J为相应JACOBI矩阵

N=100; %最大迭代次数
k=1;
while k<N
    x1=x0;
    [f,J]=feval(fun,x0);
    if det(J)<eps %JACOBI矩阵奇异时停止计算
        break ;
    end
    x0=x0-J/f;
    if norm(x0-x1)<eps  %范数 
        break;
    end
    k=k+1;
end
x=x0;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%fun的形式:
function [f,J]=fun(x)
f=[  ];
J=[  ];

8 楼

非常非常谢谢!!!
今天时间不行了,明天仔细看看!
让你写咋这么简单呢!
再次感谢阿!

9 楼

飞常感谢Guassfans!!!
可是你的程序还是解决不了我的问题,以前我对自己的问题模糊不清把,但是参照了你的程序,我可以确定我的问题在哪里了——雅克比矩阵就是接近奇异的。
我的方程组是:
0.4*cos(q2)+0.3*cos(q3)+0.1*cos(q1)-0.4=0
0.4*sin(q2)+0.3*sin(q3)+0.1*sin(q1)-0.1=0
这是书上的一个例题,是最简单的一个了,其中q1是可知的变量,初始状态为45度。书上的结果是:在初始状态下也就是在q1=45度的情况下,q2在0.7到0.8之间,q3在0.9到1之间的一个数,具体我没记清楚。他也是用计算机求解的,但不知道是用什么方法。

就像你的方法把,雅克比矩阵总是接近于奇异,该咋办呢?是不是雅克比矩阵奇异方程组就一定无解了???还有其他方法解决这种问题吗?
真不知道书商事怎么解出来的,看不到他的源代码

f=[0.4*cos(q2)+0.3*cos(q3)+0.1*cos(pi/4)-0.4;
    0.4*sin(q2)+0.3*sin(q3)+0.1*sin(pi/4)-0.1];
J =[-2/5*sin(q2),-3/10*sin(q3);
     2/5*cos(q2),3/10*cos(q3)]
J是雅克比,总是很小,接近于0

10 楼

怎样弄能看到exe文件的源代码阿?

我来回复

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