声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1537|回复: 7

[编程技巧] 大家帮我看看用牛顿法解非线性方程组的matlab错在那里?

[复制链接]
发表于 2007-11-22 15:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
大家帮我看看用牛顿法解非线性方程组的matlab错在那里?
总共三个函数,调用snow_whzh

function snow_whzh
syms x1 y1 fi1 x2 y2 fi2 x3 y3 fi3 t ti;
q=[x1;y1;fi1;x2;y2;fi2;x3;y3;fi3];  %变量列表
Q=[fi1-pi*t-pi/4;
   x1-cos(fi1);   %fi1是已知变量,初值为pi/4
   y1-sin(fi1);
   x2-2*cos(fi2)-2*x1;
   y2-2*sin(fi2);
   y1-y2;
   x3-x2-2*cos(fi2);
   y3;
   fi3;];   %Q是约束方程——非线性方程组
tn=input('过程分析的最大时间量tn=');
J=snow_jacobi(Q,q);
disp(q');
for ti=0:tn/10:tn
    Q=subs(Q,t,ti)      
    q=snow_NR(Q,J,q);
    disp(q');
end

function x=snow_NR(Q,J,x)
%用N-R法求解非线性方程组
%其中Q是约束方程向量,J是约束方程雅可比,%X是各个变量组成的向量
m=length(x);
for i=1:m
    x0(i)=1-1/i;
end
x0=x0';
N=200; %最大迭代次数
k=1;
while k<N
    xx=x0;
    QQ=subs(Q,x(1),x0(1));
    for i=2:m
        QQ=subs(QQ,x(i),x0(i));
    end
    %disp(QQ);
    %QQ=numeric(QQ);
    JJ=subs(J,x(1),x0(1));
    for i=2:m
        JJ=subs(JJ,x(i),x0(i));
    end
    %JJ=numeric(JJ);
    if abs(det(JJ))<eps %JACOBI矩阵奇异时停止计算
        break ;
    end
    x0=x0-JJ\QQ;
    x0=numeric(x0);
    if norm(x0-xx)<eps  %范数
        break;
    end
    k=k+1;
end
x=x0;

function A=snow_jacobi(B,q)
%求约束方程的雅可比矩阵
n=length(B);
m=length(q);
for i=1:n
    for j=1:m
        A(i,j)=diff(B(i),q(j));
    end
end
回复
分享到:

使用道具 举报

发表于 2007-11-22 16:43 | 显示全部楼层
原帖由 tianya7071 于 2007-11-22 15:32 发表
大家帮我看看用牛顿法解非线性方程组的matlab错在那里?
总共三个函数,调用snow_whzh

function snow_whzh
syms x1 y1 fi1 x2 y2 fi2 x3 y3 fi3 t ti;
q=[x1;y1;fi1;x2;y2;fi2;x3;y3;fi3];  %变量列表
Q ...

何谓出错?请参照置顶帖的要求叙述清楚你的问题
 楼主| 发表于 2007-11-22 20:51 | 显示全部楼层

大家帮我看看用牛顿法解非线性方程组的matlab错在那里

就是运行出现一下的错误,不知道为什么?
??? Error using ==> <
Function '<' is not defined for values of class 'sym'.

Error in ==> D:\matlab6.5\work\牛顿迭代\snow_NR.m
On line 25  ==>     if abs(det(JJ))<eps %JACOBI矩阵奇异时停止计算

Error in ==> D:\matlab6.5\work\牛顿迭代\snow_whzh.m
On line 18  ==>     q=snow_NR(Q,J,q);
发表于 2007-11-22 20:58 | 显示全部楼层
原帖由 tianya7071 于 2007-11-22 20:51 发表
就是运行出现一下的错误,不知道为什么?
??? Error using ==> <
Function ' D:\matlab6.5\work\牛顿迭代\snow_NR.m
On line 25  ==>     if abs(det(JJ)) D:\matlab6.5\work\牛顿迭代\snow_whzh.m
On line ...


符号变量不能进行大小比较,这是所有编程语言都遵循的规则。请按照出错提示自己调试一下、修改一下
 楼主| 发表于 2007-11-23 10:50 | 显示全部楼层
怎么调试啊,能不能说的具体点啊
发表于 2007-11-23 10:53 | 显示全部楼层
原帖由 tianya7071 于 2007-11-23 10:50 发表
怎么调试啊,能不能说的具体点啊

请在置顶帖中找答案
发表于 2007-11-23 10:54 | 显示全部楼层
符号变量不能比较

k-N<0
发表于 2007-11-23 11:21 | 显示全部楼层
请将原问题公式帖一下,以便确定是否需要象你的代码那样需要符号变量。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-14 03:38 , Processed in 0.069771 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表