数学软件实验任务书
实验一 非线性方程组的牛顿迭代法 1 实验原理
对于非线性方程
⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12
在x (k ) 处按照多元函数的泰勒展开,并取线性项得到 ⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫⎛x 1(k +1) -x 1(k ) ⎫ (k ) (k ) (k ) (k +1) (k ) ⎪(k ) ⎪f (x , x , , x ) x -x 1n n 2⎪ n ⎪+f '(x (k ) ) 2=0 ⎪ ⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪ x (k +1) -x (k ) ⎪⎪1n n n ⎭⎝n ⎭⎝n
其中
∂f 1⎫⎛∂f 1 ∂x ∂x n ⎪1 ⎪f '(x ) = ⎪ ⎪∂f ∂f n n ⎪ ∂x ∂x ⎪n ⎭⎝1
⎛x 1(k +1) ⎫⎛x 1(k ) ⎫⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫ (k +1) ⎪ (k ) ⎪ (k ) (k ) (k ) (k ) ⎪x x f (x , x , , x ) ⎪1n n 2⎪= 2⎪-[f '(x (k ) )]-1 n ⎪ ⎪ ⎪ x (k +1) ⎪⎪ x (k ) ⎪⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪1n n ⎝n ⎭⎝n ⎭⎝n ⎭2 数据来源
计算非线性方程组
⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0
初值取⎢⎥=⎢⎥ ⎡x ⎤
⎣y ⎦⎡1⎤⎣1⎦
3 实验步骤
步骤一:编写牛顿迭代法的基本程序。
打开 Editor 编辑器,输入以下语句:
function [x,n,data]=new_ton(x0,tol)
if nargin==1
tol=1e-10;
end
x1=x0-f1(x0)/df1(x0);
MATLAB 241 数值分析与应用
n=1;
%迭代过程
while (norm(x1-x0)>tol)
x0=x1;
x1=x0-f1(x0)/df1(x0);
n=n+1;
%data 用来存放中间数据
data(:,n)=x1;
end
x=x1;
以文件名new_ton.m保存。
步骤二:编写方程函数与方程的Jacobi 矩阵函数。
(1)打开Editor 编辑器输入以下语句:
%牛顿迭代法的方程函数
function f=f1(x0)
x=x0(1);
y=x0(2);
f1=x^2-2*x-y+0.5;
f2=x^2+4*y^2-4;
%最后方程函数以行向量输出
f=[f1 f2];
以文件名f1.m 保存。
(2)新打开Editor 编辑器输入以下语句:
%牛顿迭代法的jacobi 矩阵
function f=df1(x0);
x=x0(1);
y=x0(2);
f=[2*x-2 -1
2*x 8*y];
以文件名df1.m 保存。
步骤三:编写主函数。
打开 Editor 编辑器输入以下语句:
%牛顿迭代法的主函数
x0=[1 1];
[x,n,data]=new_ton(x0);
disp('计算结果为')
x
disp('迭代次数为')
n
%抽取data1中第一个变量数据画出曲线
subplot(2,1,1)
plot(data(1,:)),title('x 在迭代中的变化')
%抽取data 中的第二个变量数据画出其变化曲线
subplot(2,1,2)
plot(data(2,:)),title('y在迭代中的变化')
以文件名new_main.m保存。
4 实验结果
计算结果为
x =
-0.[**************] 0.[**************]
迭代次数为
n =
16
实验二 非线性方程组的最速下降法
1 实验原理
对于非线性方程组
⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12
令
h =f 12+f 22+ +f n 2
如果给定一个初值x 0,我们希望找到一条路线每一次x 迭代以后代价函数都会比原来小一些。
x k +1=x k +λp k
l 称为步长因子λ,p k 的不同,就构成了不同的下降算法。如果取 p (x ) =-gradh (x ), p k =p (x k )
就是所谓的最速下降法。最速下降法是大范围收敛的h 在某x k 出沿最速下降方向
p k (x ) =-gradh (x k )
下降的最快
2 数据来源
计算非线性方程组
⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0
初值取⎢⎥=⎢⎥ ⎡x ⎤
⎣y ⎦⎡1⎤⎣1⎦
3 实验步骤
步骤一:打开 Editor 编辑器,输入以下语句:
syms x y
f1=x^2-2*x-y+0.5;
f2=x^2+4*y^2-4;
h=f1^2+f2^2
grad=[diff(h,x),diff(h,y)];
grad=simple(grad)
以文件名tidu_fuhao.m保存。
步骤二:编写梯度函数。
打开 Editor 编辑器,输入以下语句:
function f=f1_tidu(x0)
x=x0(1);
y=x0(2);
f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3]';
步骤四:编写最速下降法的方法函数。
打开 Editor 编辑器,输入以下语句:
function [x,n,data]=zuisu(x0,tol)
if nargin==1
tol=1e-4;
end
x1=x0-0.001*f1_tidu(x0);
n=1;
%迭代过程
while (norm(x1-x0)>tol)& (n
x0=x1;
%0.001 为步长因子
x1=x0-0.001*f1_tidu(x0);
n=n+1;
%data 用来存放中间数据
data(:,n)=x1;
end
x=x1;
以文件名zuisu.m 保存。
步骤四:编写主函数。
打开 Editor 编辑器,输入以下语句:
4 实验结果
运行程序得到计算结果
x =
-0.21412 0.99395
迭代次数为
n =
426
实验三 非线性方程组的不动点迭代法
1 实验原理
对于非线性方程组
⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12
可以构造如下形式结构
⎧x 1=ϕ1(x 1, x 2, , x n ) ⎪x =ϕ(x , x , , x ) ⎪2112n ⎨ ⎪⎪⎩x n =ϕ1(x 1, x 2, , x n )
由上式可以构造如下迭代格式
⎧x 1(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪x 2 ⎨ ⎪
(k +1) ⎪=ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎩x n
000选择初值向量x (0)=ϕ1(x 1, x 2, , x n ,) 边可以逐步递推下去。这就是不动
点迭代法的基本原理。
记矩阵
⎛∂ϕ1 ∂x 1
ϕ'(x ) = ∂ϕn ∂x ⎝1
可以证明如果∂ϕ1⎫∂x n ⎪⎪ ⎪ ⎪∂ϕn ⎪ ∂x 1⎪⎭ ϕ'(x )
2 数据来源
计算非线性方程组
⎧x +x sin y =2.2378 ⎨3⎩x -y -cos y =0
初值取⎢⎥=⎢⎥ ⎡x ⎤
⎣y ⎦⎡0⎤⎣0⎦
3 实验步骤
步骤一:编写不动点迭代方法。
打开 Editor 编辑器,输入以下语句:
%不动点迭代法计算非线形方程组
%08-6-26
%输入量x0 为初值,tol 为误差容限
%输出量r 为计算结果 n为迭代次数data1为计算的中间数据 function [r,n,data]=budong(x0,tol)
%如果输入量少于两个默认误差为10 的-3 次方
if nargin==1
tol=1.0e-3;
end
x1=budong_fun(x0);
n=1;
%迭代过程
while (norm(x1-x0)>tol)&(n
x0=x1;
x1=budong_fun(x0);
n=n+1;
%data1用于存放计算的中间数据这样可以分析运算收敛情况 data(:,n)=x1;
end
r=x1;
以文件名字budong.m 保存。
步骤二:编写要计算的函数文件。
打开 Editor 编辑器,输入以下语句:
function f=budong_fun(x)
f(1)=-sin(x(2))*x(1)+2.2378;
f(2)=x(1)^3-cos(x(2))£»
f=[f(1) f(2)];
以文件名budong_fun.m保存。
步骤三:编写主函数文件。
打开 Editor 编辑器,输入以下语句: x0=[0 0];
[r,n,data]=budong(x0);
disp('计算结果为')
r
disp('迭代次数为')
n
%抽取data1中第一个变量数据画出曲线 subplot(2,1,1)
plot(data(1,:))
%抽取data 中的第二个变量数据画出其变化曲线 subplot(2,1,2)
plot(data(2,:))
%以下为数据保存部分,注意查看当前工作空间 num=(1:n)';
a=[num data'];
save data1.txt a –ascii
以文件名budong_main.m保存。
4 实验结果
运行程序得到计算结果
计算结果为
r =
1.[1**********]494 1.[1**********]258
迭代次数为
n =
211
数学软件实验任务书
实验一 非线性方程组的牛顿迭代法 1 实验原理
对于非线性方程
⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12
在x (k ) 处按照多元函数的泰勒展开,并取线性项得到 ⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫⎛x 1(k +1) -x 1(k ) ⎫ (k ) (k ) (k ) (k +1) (k ) ⎪(k ) ⎪f (x , x , , x ) x -x 1n n 2⎪ n ⎪+f '(x (k ) ) 2=0 ⎪ ⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪ x (k +1) -x (k ) ⎪⎪1n n n ⎭⎝n ⎭⎝n
其中
∂f 1⎫⎛∂f 1 ∂x ∂x n ⎪1 ⎪f '(x ) = ⎪ ⎪∂f ∂f n n ⎪ ∂x ∂x ⎪n ⎭⎝1
⎛x 1(k +1) ⎫⎛x 1(k ) ⎫⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫ (k +1) ⎪ (k ) ⎪ (k ) (k ) (k ) (k ) ⎪x x f (x , x , , x ) ⎪1n n 2⎪= 2⎪-[f '(x (k ) )]-1 n ⎪ ⎪ ⎪ x (k +1) ⎪⎪ x (k ) ⎪⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪1n n ⎝n ⎭⎝n ⎭⎝n ⎭2 数据来源
计算非线性方程组
⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0
初值取⎢⎥=⎢⎥ ⎡x ⎤
⎣y ⎦⎡1⎤⎣1⎦
3 实验步骤
步骤一:编写牛顿迭代法的基本程序。
打开 Editor 编辑器,输入以下语句:
function [x,n,data]=new_ton(x0,tol)
if nargin==1
tol=1e-10;
end
x1=x0-f1(x0)/df1(x0);
MATLAB 241 数值分析与应用
n=1;
%迭代过程
while (norm(x1-x0)>tol)
x0=x1;
x1=x0-f1(x0)/df1(x0);
n=n+1;
%data 用来存放中间数据
data(:,n)=x1;
end
x=x1;
以文件名new_ton.m保存。
步骤二:编写方程函数与方程的Jacobi 矩阵函数。
(1)打开Editor 编辑器输入以下语句:
%牛顿迭代法的方程函数
function f=f1(x0)
x=x0(1);
y=x0(2);
f1=x^2-2*x-y+0.5;
f2=x^2+4*y^2-4;
%最后方程函数以行向量输出
f=[f1 f2];
以文件名f1.m 保存。
(2)新打开Editor 编辑器输入以下语句:
%牛顿迭代法的jacobi 矩阵
function f=df1(x0);
x=x0(1);
y=x0(2);
f=[2*x-2 -1
2*x 8*y];
以文件名df1.m 保存。
步骤三:编写主函数。
打开 Editor 编辑器输入以下语句:
%牛顿迭代法的主函数
x0=[1 1];
[x,n,data]=new_ton(x0);
disp('计算结果为')
x
disp('迭代次数为')
n
%抽取data1中第一个变量数据画出曲线
subplot(2,1,1)
plot(data(1,:)),title('x 在迭代中的变化')
%抽取data 中的第二个变量数据画出其变化曲线
subplot(2,1,2)
plot(data(2,:)),title('y在迭代中的变化')
以文件名new_main.m保存。
4 实验结果
计算结果为
x =
-0.[**************] 0.[**************]
迭代次数为
n =
16
实验二 非线性方程组的最速下降法
1 实验原理
对于非线性方程组
⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12
令
h =f 12+f 22+ +f n 2
如果给定一个初值x 0,我们希望找到一条路线每一次x 迭代以后代价函数都会比原来小一些。
x k +1=x k +λp k
l 称为步长因子λ,p k 的不同,就构成了不同的下降算法。如果取 p (x ) =-gradh (x ), p k =p (x k )
就是所谓的最速下降法。最速下降法是大范围收敛的h 在某x k 出沿最速下降方向
p k (x ) =-gradh (x k )
下降的最快
2 数据来源
计算非线性方程组
⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0
初值取⎢⎥=⎢⎥ ⎡x ⎤
⎣y ⎦⎡1⎤⎣1⎦
3 实验步骤
步骤一:打开 Editor 编辑器,输入以下语句:
syms x y
f1=x^2-2*x-y+0.5;
f2=x^2+4*y^2-4;
h=f1^2+f2^2
grad=[diff(h,x),diff(h,y)];
grad=simple(grad)
以文件名tidu_fuhao.m保存。
步骤二:编写梯度函数。
打开 Editor 编辑器,输入以下语句:
function f=f1_tidu(x0)
x=x0(1);
y=x0(2);
f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3]';
步骤四:编写最速下降法的方法函数。
打开 Editor 编辑器,输入以下语句:
function [x,n,data]=zuisu(x0,tol)
if nargin==1
tol=1e-4;
end
x1=x0-0.001*f1_tidu(x0);
n=1;
%迭代过程
while (norm(x1-x0)>tol)& (n
x0=x1;
%0.001 为步长因子
x1=x0-0.001*f1_tidu(x0);
n=n+1;
%data 用来存放中间数据
data(:,n)=x1;
end
x=x1;
以文件名zuisu.m 保存。
步骤四:编写主函数。
打开 Editor 编辑器,输入以下语句:
4 实验结果
运行程序得到计算结果
x =
-0.21412 0.99395
迭代次数为
n =
426
实验三 非线性方程组的不动点迭代法
1 实验原理
对于非线性方程组
⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12
可以构造如下形式结构
⎧x 1=ϕ1(x 1, x 2, , x n ) ⎪x =ϕ(x , x , , x ) ⎪2112n ⎨ ⎪⎪⎩x n =ϕ1(x 1, x 2, , x n )
由上式可以构造如下迭代格式
⎧x 1(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪x 2 ⎨ ⎪
(k +1) ⎪=ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎩x n
000选择初值向量x (0)=ϕ1(x 1, x 2, , x n ,) 边可以逐步递推下去。这就是不动
点迭代法的基本原理。
记矩阵
⎛∂ϕ1 ∂x 1
ϕ'(x ) = ∂ϕn ∂x ⎝1
可以证明如果∂ϕ1⎫∂x n ⎪⎪ ⎪ ⎪∂ϕn ⎪ ∂x 1⎪⎭ ϕ'(x )
2 数据来源
计算非线性方程组
⎧x +x sin y =2.2378 ⎨3⎩x -y -cos y =0
初值取⎢⎥=⎢⎥ ⎡x ⎤
⎣y ⎦⎡0⎤⎣0⎦
3 实验步骤
步骤一:编写不动点迭代方法。
打开 Editor 编辑器,输入以下语句:
%不动点迭代法计算非线形方程组
%08-6-26
%输入量x0 为初值,tol 为误差容限
%输出量r 为计算结果 n为迭代次数data1为计算的中间数据 function [r,n,data]=budong(x0,tol)
%如果输入量少于两个默认误差为10 的-3 次方
if nargin==1
tol=1.0e-3;
end
x1=budong_fun(x0);
n=1;
%迭代过程
while (norm(x1-x0)>tol)&(n
x0=x1;
x1=budong_fun(x0);
n=n+1;
%data1用于存放计算的中间数据这样可以分析运算收敛情况 data(:,n)=x1;
end
r=x1;
以文件名字budong.m 保存。
步骤二:编写要计算的函数文件。
打开 Editor 编辑器,输入以下语句:
function f=budong_fun(x)
f(1)=-sin(x(2))*x(1)+2.2378;
f(2)=x(1)^3-cos(x(2))£»
f=[f(1) f(2)];
以文件名budong_fun.m保存。
步骤三:编写主函数文件。
打开 Editor 编辑器,输入以下语句: x0=[0 0];
[r,n,data]=budong(x0);
disp('计算结果为')
r
disp('迭代次数为')
n
%抽取data1中第一个变量数据画出曲线 subplot(2,1,1)
plot(data(1,:))
%抽取data 中的第二个变量数据画出其变化曲线 subplot(2,1,2)
plot(data(2,:))
%以下为数据保存部分,注意查看当前工作空间 num=(1:n)';
a=[num data'];
save data1.txt a –ascii
以文件名budong_main.m保存。
4 实验结果
运行程序得到计算结果
计算结果为
r =
1.[1**********]494 1.[1**********]258
迭代次数为
n =
211