Matlab解非线性方程组2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab解⾮线性⽅程组2
⾮线性⽅程组求解-Matlab-fsolve
实例⼀:
①建⽴⽂件fun.m:
function y=fun(x)
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))];
②>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))
注:...为续⾏符
m⽂件必须以function为⽂件头,调⽤符为@;⽂件名必须与定义的函数名相同;fsolve()主要求解复杂⾮线性⽅程和⽅程组,求解过程是⼀个逼近过程。
实例⼆:
①建⽴⽂件fun.m
function F=myfun(x)
F=[x(1)-3*x(2)-sin(x(1));2*x(1)+x(2)-cos(x(2))];
②然后在命令窗⼝求解:
>> x0=[0;0]; %设定求解初值
>> options=optimset('Display','iter'); %设定优化条件
>> [x,fv]=fsolve(@myfun,x0,options) %优化求解
%MATLAB显⽰的优化过程
Norm of First-order Trust-region Iteration Func-count f(x) step optimality radius
0 3 1 2 1
1 6 0.000423308 0.5 0.0617 1
2 9 5.17424e-010 0.0075143
3 4.55e-005 1.25
3 12 9.99174e-022 1.15212e-005 9.46e-011 1.25 Optimization terminated: first-order optimality is less than options.TolFun. x =
0.4966
0.0067
fv =
1.0e-010 *
0.3161
0.0018
实例三:
求下列⾮线性⽅程组在(0.5,0.5) 附近的数值解。
(1) 建⽴函数⽂件myfun.m。
function q=myfun(p)
x=p(1);
y=p(2);
q(1)=x-0.6*sin(x)-0.3*cos(y);
q(2)=y-0.6*cos(x)+0.3*sin(y);
(2) 在给定的初值x0=0.5,y0=0.5下,调⽤fsolve函数求⽅程的根。
x=fsolve('myfun',[0.5,0.5]',optimset('Display','off')) x =
0.6354
0.3734
---------------------------------------------------------------------实例五:
①建⽴⽂件myfxeq05.m
function f=myfxeq05(xvect)
x = xvect(1);
y = xvect(2);
z = xvect(3);
f(1)=sin(x) + y^2 + log(z) - 7
f(2)=3*x + 2^y - z^3 + 1
f(3)=x + y + z – 5
②解⽅程
clear all
disp('Solve the following set of nonlinear algebraic equations:') disp(' sin(x) + y^2 + ln(z) - 7 = 0 ')
disp(' 3*x + 2^y - z^3 + 1 = 0 ')
disp(' x + y + z - 5 = 0 ')
disp(' ')
xguess=[1 1 1]';
xvect = fsolve('myfxeq05', xguess);
x = xvect(1);
y = xvect(2);
z = xvect(3);
disp('The roots from the default "fsolve" are: ')
disp([' x = ', num2str(x) ])
disp([' y = ', num2str(y) ])
disp([' z = ', num2str(z) ])
% Repeat with a different set of options ------------------------------- options(2) = 1.e-6; %Tolerance for x options(3) = 1.e-6; %Tolerance for f
options(5) = 1; %Levenberg-Marquardt Method
xvect = fsolve('myfxeq05', xguess, options);
x = xvect(1);
y = xvect(2);
z = xvect(3);
disp('The roots from "fsolve" with Levenberg-Marquardt are: ') disp([' x = ', num2str(x) ])
disp([' y = ', num2str(y) ])
disp([' z = ', num2str(z) ])
实例六:
对于求解⾮线性⽅程组⼀般⽤fsolve命令就可以了,但是对于⽅程组中某⼀系数是变化的,该怎么求呢?%定义⽅程组如下,其中k为变量
function F = myfun(x,k)
H=0.32;
Pc0=0.23;W=0.18;
F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2);
x(1)-k*sqrt(x(2))];
%求解过程
H=0.32;
Pc0=0.23;W=0.18;
x0 = [2*W; Pc0+2*H];% 取初值
options = optimset('Display','off');
k=0:0.01:1; % 变量取值范围[0 1]
for i=1:1:length(k)
kk=k(i);
x = fsolve(@(x) myfun(x,kk), x0, options);%求解⾮线性⽅程组x1(i)=x(1);
x2(i)=x(2);
end
plot(k,x1,'-b',k,x2,'-r');
xlabel('k')
legend('x1','x2')
(来⾃振动论坛,作者:studyboy)。