第一个函数
function [r,n]=mulNewton(x0,funcMat,var,eps) % x0为变量的起始值,funcMat是方程,var为方程的变量,eps控制精度
% 牛顿迭代法解非线性方程组
if nargin==0
x0 = [0,0,0,0,0,0];
funcMat=[sym('(cos(oz)*cos(oy)*(-25.882)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*96.59+xp+123.75)^2+(sin(oz)*cos(oy)*(-25.882)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*96.59+yp-123.75)^2+(-sin(oy)*(-25.882)+cos(oy)*sin(ox)*96.59+zp-100)^2-260^2')...
sym('(cos(oz)*cos(oy)*(-96.59)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-25.882+xp-(-169.04))^2+(sin(oz)*cos(oy)*(-96.59)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*25.882+yp-45.29)^2+(-sin(oy)*(-96.59)+cos(oy)*sin(ox)*25.882+zp-100)^2-260^2')...
sym('(cos(oz)*cos(oy)*(-70.71)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-70.71+xp-(-45.29))^2+(sin(oz)*cos(oy)*(-70.71)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*-70.71+yp-(-169.04))^2+(-sin(oy)*(-70.71)+cos(oy)*sin(ox)*-70.71+zp-100)^2-260^2')...
sym('(cos(oz)*cos(oy)*(70.71)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-70.71+xp-(45.29))^2+(sin(oz)*cos(oy)*(70.71)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*-70.71+yp-(-169.04))^2+(-sin(oy)*(70.71)+cos(oy)*sin(ox)*-70.71+zp-100)^2-260^2')...
sym('(cos(oz)*cos(oy)*(96.59)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-25.882+xp-(169.04))^2+(sin(oz)*cos(oy)*(96.59)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*-25.882+yp-(45.29))^2+(-sin(oy)*(96.59)+cos(oy)*sin(ox)*-25.882+zp-100)^2-260^2')...
sym('(cos(oz)*cos(oy)*(25.882)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*96.59+xp-(123.75))^2+(sin(oz)*cos(oy)*(25.882)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*96.59+yp-(123.75))^2+(-sin(oy)*(25.882)+cos(oy)*sin(ox)*96.59+zp-100)^2-260^2')];
var=[sym('oz') sym('oy') sym('ox') sym('xp') sym('yp') sym('zp')];
eps=1.0e-4;
end
n_Var = size(var,2);%变量的个数
n_Func = size(funcMat,2);%函数的个数
n_X = size(x0,2);%变量的个数
if n_X ~= n_Var && n_X ~= n_Func
fprintf('Expression Error!\n');
exit(0); %退出程序
end
r=x0-myf(x0, funcMat, var)*pinv(dmyf(x0, funcMat, var));
n=0;
tol=1;
while tol>=eps
x0=r;
r=x0-myf(x0, funcMat, var)*pinv(dmyf(x0, funcMat, var));
tol=norm(r-x0);
n=n+1;
if(n>100000)
disp('迭代步数太多,方程可能不收敛');
return;%跳出程序
end
end
end % end mulNewton
第二个函数
function f=myf(x,funcMat, varMat)
% 输入参数x为数值,func为符号变量矩阵,var为符号变量矩阵中的变量
% 返回值为矩阵,内容为数值
n_X = size(x,2);%变量的个数
f_Val = zeros(1,n_X);
for i=1:n_X
tmp_Var = cell(1,n_X);
tmp_X = cell(1,n_X);
for j=1:n_X
tmp_Var{j} = varMat(1,j);
tmp_X{j} = x(1,j);
end
f_Val(i) = subs(funcMat(1, i), tmp_Var, tmp_X);%subs替换符号指令
end
f=f_Val;
end % end myf
第三个函数
function df_val=dmyf(x, funcMat, varMat)
% 返回值为矩阵,内容为数值
%df=[df1/x1, df1/x2;
% df2/x1. df2/x2];
n_X = size(x,2);%变量的个数
df =cell(n_X, n_X);
for i=1:n_X
for j=1:n_X
df{i,j} = diff(funcMat(1, i), varMat(1, j));
end
end
df_val=zeros(n_X, n_X);
for i=1:n_X
for j=1:n_X
tmp_Var = cell(1,n_X);
tmp_X = cell(1,n_X);
for k=1:n_X
tmp_Var{k} = varMat(1,k);
tmp_X{k} = x(1,k);
end
df_val(i,j) = subs(df{i,j}, tmp_Var, tmp_X);
end
end
end % end dmyf
运行后会出现的错误:
>> mulNewton
错误使用 sym>convertExpression (line 1391)
Conversion to 'sym' returned the MuPAD error: Error: Invalid input. ')' is expected. [line 1, col 252]
出错 sym>convertChar (line 1302)
s = convertExpression(x);
出错 sym>convertCharWithOption (line 1285)
s = convertChar(x);
出错 sym>tomupad (line 999)
S = convertCharWithOption(x,a);
出错 sym (line 142)
S.s = tomupad(x,'');
出错 mulNewton (line 6)
funcMat=[sym('(cos(oz)*cos(oy)*(-25.882)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*96.59+xp+123.75)^2+(sin(oz)*cos(oy)*(-25.882)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*96.59+yp-123.75)^2+(-sin(oy)*(-25.882)+cos(oy)*sin(ox)*96.59+zp-100)^2-260^2')...
>> 麻烦各位帮忙看看,新手小白不太会改错改语法。。