目录
实验十一:非线性方程(组)求解
练习一
练习二
练习三
实验十一:非线性方程(组)求解
练习一
1.求莱昂纳多方程 的解
clc;clear;
p=[1,2,10,-20];
roots(p)
ans =
-1.6844 + 3.4313i
-1.6844 - 3.4313i
1.3688 + 0.0000i
2.求方程 的解.
clc;clear;
f=@(x)exp(x)+10*x-2;
ezplot(f);
grid on
fzero(f,[-2,2])
ans =
0.0905
练习二
用“二分法”求解下列问题(要求精度达到 )
1.求圆 与曲线 的两个交点坐标
clc;clear;
ezplot('exp(-x)');
hold on
ezplot('x^2+y^2-2');
axis([-5,5,-5,5]);
%精度为10^-5,由图像知有两个交点,我们分别在[-0.5,0.5]和[1,1.5]两个区间二分
f=@(x)sqrt(2-x^2)-exp(-x);
a1=-0.5;a2=0.5;
while abs(a2-a1)>10^-4c1=(a1+a2)/2;if f(c1)==0break;endif f(c1)<0a1=c1;endif f(c1)>0a2=c1;end
end
c1
a1=1;a2=1.5;
while abs(a2-a1)>10^-4c1=(a1+a2)/2;if f(c1)==0break;endif f(c1)>0a1=c1;endif f(c1)<0a2=c1;end
end
c1
c1 =
-0.3203
c1 =
1.3922
注:函数的单调性不同时,传递值时的判断条件不同。
2.求方程 的最大正数解和最小负数解,并分别确定二分区间的次数
clc;clear;
ezplot('3*x^2-exp(x)');grid;
%精度为10^-4,该方程有两个解,两个正数解,一个负数解
f=@(x)-(3*x^2-exp(x));
a1=-1;a2=0;%在这里修改数据,第二次a1=4,a2=5
while abs(a2-a1)>10^-4c1=(a1+a2)/2;if f(c1)==0
k=k+1;break;endif f(c1)<0a1=c1;endif f(c1)>0a2=c1;end
k=k+1;
end
c1 ,k
3.求方程 在 的正数解
clc;clear;
ezplot('1-x-sin(x)');grid;
%精度为10^-4
f=@(x)-(1-x-sin(x));
a1=0;a2=1;k=0;
while abs(a2-a1)>10^-4c1=(a1+a2)/2;if f(c1)==0k=k+1;break;endif f(c1)<0a1=c1;endif f(c1)>0a2=c1;endk=k+1;
end
c1,k
c1 =0.5109
k =14
练习三
1.方程 在(0,4)内有唯一的实数解,现构造以下三种迭代函数:
(1),迭代初值;
(2) 迭代初值 ;
(3) ,迭代初值 ,
分别用给出的3种迭代函数构造迭代序列观察这些迭代序列是否收敛,若收敛能否收敛到方程的解?除此之外,你还能构造出其他收敛的选代序列吗?
先画出图像:
clc;clear;
ezplot('x^2+x-4');grid;
(1)
clc;clear;
a0=4;a1=0;x0=[4];k=0;
while abs(a0-a1)>1.0e-3a1=a0;a0=4-a0^2;x0=[x0,a0];k=k+1;
end
x0
x0 =
1.0e+274 *
列 1 至 10
0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -4.9971
列 11 至 12
-Inf -Inf
显然,该迭代函数不收敛。
(2)
clc;clear;
format long
a0=4;a1=0;x0=[4];k=0;
while abs(a0-a1)>1.0e-5a1=a0;a0=4/(1+a0);x0=[x0,a0];k=k+1;
end
x0,k
x0 =
列 1 至 5
4.000000000000000 0.800000000000000 2.222222222222222 1.241379310344828 1.784615384615385
列 6 至 10
1.436464088397790 1.641723356009070 1.514163090128755 1.590986684875384 1.543813414152062
列 11 至 15
1.572442372442373 1.554942510219287 1.565592957180350 1.559093771599724 1.563053313790665
列 16 至 20
1.560638625220067 1.562110311311980 1.561213029095425 1.561759976448632 1.561426533622873
列 21 至 25
1.561629797885483 1.561505883208351 1.561581422171047 1.561535372398912 1.561563444760846
列 26 至 28
1.561546331472360 1.561556763917999 1.561550404169786
k=27
由以上数列知,该迭代函数收敛,且收敛于1.56155.
(3)
clc;clear;
format long
a0=4;a1=0;x0=[4];k=0;
while abs(a0-a1)>1.0e-5a1=a0;a0=a0-(a0^2+a0-4)/(2*a0+1);x0=[x0,a0];k=k+1;
end
x0,k
x0 =
列 1 至 5
4.000000000000000 2.222222222222222 1.641723356009070 1.563053313790665 1.561553358481398
列 6
1.561552812808902
k =5
其他方法:
clc;clear;
format long
a0=4;a1=0;x0=[4];k=0;
while abs(a0-a1)>1.0e-5a1=a0;a0=sqrt(4-a0);%构造x=sqrt(4-x)x0=[x0,a0];k=k+1;
end
x0,k
x0 =
列 1 至 5
4.000000000000000 0 2.000000000000000 1.414213562373095 1.608038070950718
列 6 至 10
1.546596886408764 1.566334291775302 1.560021060186271 1.562043193965432 1.561395787759967
列 11 至 14
1.561603090493879 1.561536714107651 1.561557967509483 1.561551162303213
k =13
2.用单点弦截法求示例3中方程解的近似值(误差< ).
注:示例三中方程为:
显然,该二次方程由两个解:一个正解和一个负解。
我们分别选取(2,3)、(1,-1)和(-3,3)、(-2,-1)作为初始弦端点进行迭代。
clc;clear;
format long
f=@(x)x^2+x-3;
%正解
a=1;b=2;t=a;k=0;%这里可以修改数值
while abs(t)>1.0e-5m=b-(b-a)/(f(b)-f(a))*f(b);t=m-a;a=m;k=k+1;
end
m,k
m =1.302774668159284
k =7;
负解的情况令a=-2,b=-3即可。(其他不用变)
m =-2.302774668159283
k = 7
3.用双点弦截法求方程的解(误差<).
首先画出函数图形。
clc;clear;
f=inline('2^x-x^2-1');
ezplot(f);grid;
由图形知该函数有三个零点。
clc;clear;
format long;
x0=-0.5;x1=0.5;k=0;%在这里更改x0和x1值
while abs(x0-x1)>1.0e-5x2=x1-f(x1)/(f(x1)-f(x0))*(x1-x0);x0=x1;x1=x2;k=k+1;
endx2
x2 = 2.597847652721268e-13
x2 =0.999999996956345
x2 =4.257461915372301
注:这里我们要注意刚开始时,谁做为x0,谁做为x1.经过我的观察,x0点一定符合
和 同号这个条件,而x1即为另一个点。
4.用牛顿切线迭代法求方程 的解,你能否构造出其他形式的选代序列,使其收敛到该方程的一个解?
首先我们要判断该方程的解在哪个区间内,画出该函数的图像;其次,再该区间内该函数的凸凹性是怎么样的。
clc;clear;
syms x
f=x^2-2*x*exp(x)+exp(-x);
figure(1)
ezplot(f);grid;
f2=diff(f,x,2);
figure(2)
ezplot(f2);grid;
由上图分析知,区间[0,1]包含零点,且该范围内的函数为凸函数。
clc;clear;
f=inline('x^2-2*x*exp(x)+exp(-x)');
f1=inline('2*x-2*exp(x)-2*x*exp(x)-exp(-x)');
m=min(abs(f1(0)),abs(f1(1)));a=0;b=1;k=0;x0=1;
while abs(f(x0))>m*1.0e-5x1=x0-f(x0)/f1(x0);k=k+1;x0=x1;
end
x0,k
x0 =0.305710729721677
k =4
其他迭代:不妨使用一下双点弦截法
clc;clear;
format long
f=inline('x^2-2*x*exp(x)+exp(-x)');
x0=1;x1=0;
while abs(x0-x1)>1.0e-5x2=x1-f(x1)/(f(x1)-f(x0))*(x1-x0);x0=x1;x1=x2;
end
x0
x0 =0.305707037220051
本文由作者自创,由于时间原因,难免出现些许错误,还请大家多多指正。创作不易,请大家多多支持。