求解一道matlab题,选了数值分析,结果悲惨的发现自己不会用matlab

供稿:hz-xin.com     日期:2025-01-21
求解一道Matlab数值解析题,在线等,急!!!

function xianxingfangchengzu
clc
clear
A=[1 10 6;3 2 4;0 4 1];
b=[5;4;-3];
%1、用left-division方法计算答案
X=A\b
%2、用克莱默法则(Cramer's rule)计算答案
a=det(A);
if a~=0
disp('可用克莱默法则计算答案')
a1=[b A(:,2:3)];
a2=[A(:,1) b A(:,3)];
a3=[A(:,1:2) b];
x=det(a1)/a
y=det(a2)/a
z=det(a3)/a
end

if a==0
disp('不可用克莱默法则计算,有无数个答案')
end

【1】用幂法求按模最大的特征值与特征向量

A=[190 66 -84 30; 66 303 42 -36; 336 -168 147 -112; 30 -36 28 291];
X=[1 1 1 1]';%初值,随便设定啦
lambda=0;%最大特征值的初值
for k=1:100 %循环次数自己定,也可以用while
Y=A*X;%开始迭代了
m=max(abs(Y));
dc=abs(lambda-m);
Y=(1/m)*Y;
dv=norm(X-Y);
err(k)=max(dc,dv);
X=Y;
lambda=m;
end
max_lamdba=m%最大的特征值
V=X%特征向量
plot(err)%看看误差的啦


运行结果:
max_lamdba = 343.0000

V =
0.3333
1.0000
-0.0000
-0.5000

可以用eig验证:
>> eig(A)
ans =
1.0e+002 *
1.4700 + 1.9600i
1.4700 - 1.9600i
2.9400
3.4300 就是它!!!

【1*】如果看着费劲,还有一个简捷的
A=[190 66 -84 30; 66 303 42 -36; 336 -168 147 -112; 30 -36 28 291];
X=[1 1 1 1]';%初值,随便设定啦
for k=1:100 %循环次数自己定,也可以用while
Y=A*X;%开始迭代了
m=max(abs(Y));
Y=(1/m)*Y;
X=Y;
end
max_lamdba=m%最大的特征值
V=X%特征向量

【2】不会了,用这个将就吧,不好意思。
>> [V,D]=eig(A,'nobalance')
结果:
V =

-0.0000 + 0.4286i -0.0000 - 0.4286i 0.5000 -0.3333
0.0000 - 0.2143i 0.0000 + 0.2143i 0.3333 -1.0000
1.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 -0.0000
0.0000 - 0.1429i 0.0000 + 0.1429i 1.0000 0.5000


D =

1.0e+002 *

1.4700 + 1.9600i 0 0 0
0 1.4700 - 1.9600i 0 0
0 0 2.9400 0
0 0 0 3.4300

即:A*V=V*D

clear,clc
%% 求ln(x+sinx)=0的根。初值x0分别取0.1, 1,1.5, 2, 4进行计算
eq1 = @(x) log(x+sin(x));
x10 = [.1,1.5,2,4];
[x1,val1,flag1] = arrayfun(@(i)newton(eq1,x10(i)),1:length(x10));%未加速
[x1s,val1s,flag1s] = arrayfun(@(i)newton(eq1,x10(i),1),1:length(x10));%加速

%% 求sinx=0的根。初值x0分别取1,1.4,1.6, 1.8,3进行计算
eq2 = @(x) sin(x);
x20 = [1,1.4,1.6,1.8,3];
[x2,val2,flag2] = arrayfun(@(i)newton(eq2,x20(i)),1:length(x20));%未加速
[x2s,val2s,flag2s] = arrayfun(@(i)newton(eq2,x20(i),1),1:length(x20));%加速

以上程序要用到的newton函数如下,已经帮你集成了Steffensen加速法,具体用法函数里边写得很清楚,自己复制粘贴到m文件保存,m文件命名为newton.m,放在同一路径下方可使用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)
%牛顿法解方程
%[x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)
%x为方程的解;
%val为上述x带入eq的值;
%exitflag为1,求解成功;exitflag为0,达到最大迭代次数未收敛;
%exitflag为-1,步长达到最小未收敛;
%eq:函数句柄;
%x0:初值,默认为0到1随机;
%steff为加速参数,非负则加速。默认不加速;
%tol:容差,默认1e-10;
%mindx:最小迭代步长,默认1e-8;
%maxiter:最大迭代数目,默认1e4;
%例如 x = newton(@(x)log(x+sin(x)),1) 得到 x = 0.5110;
%14-Nov-2011 11:39:48,by JJBNJZ

if ~isa(eq,'function_handle')
error('我擦,要我说几遍你才知道要用函数句柄啊')
end

if nargin < 6
maxiter = 1e4;
if nargin < 5
mindx= 1e-8;
if nargin < 4
tol= 1e-10;
if nargin < 3
steff = -1;
if nargin < 2
warning('初值都没给,那从0到1之间随便选了啊')
x0 = rand;
end
end
end
end
end

x = x0;
val = eq(x0);
exitflag = 1;
eval(['df =@(x)' char(diff(eq(sym('x')))),';']);

if abs(val) <= tol
disp('你给的初值就是解,还算个毛啊,再见')
return
end

if steff <= 0
for iter = 1 : maxiter
val = eq(x);
dval = df(x);
xnew = x - val/dval;
val = eq(xnew);
if abs(val) < tol
x = xnew;
return
end
if abs(x-xnew) < mindx
exitflag = -1;
disp(['迭代步长已经小于设定的最小步长(默认1e-8),',...
'而表达式的值没有小于给定容差(默认1e-10)'])
x = xnew;
return
end
x = xnew;
end
else
st=@(x)x - eq(x)/df(x);
for iter = 1 : maxiter
xnew = x - (st(x)-x)^2 / (st(st(x)) -2*st(x) + x);
val = eq(xnew);
if abs(val) < tol
x = xnew;
return
end
if abs(x-xnew) < mindx
exitflag = -1;
disp(['迭代步长已经小于设定的最小步长(默认1e-8),',...
'而表达式的值没有小于给定容差(默认1e-10)'])
x = xnew;
return
end
x = xnew;
end
end
disp('因达到最大迭代次数而终止,求解失败;解决方法,要么增大容差(精度下降),要么增大迭代次数(变慢)')
exitflag = 0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
问题分析什么的就自己写吧,无非是些:“解方程,初值是关键”,“自从我用了Steffensen的加速方法后,嘿,还别说,还真对得起咱这张脸,从前不收脸的也收脸了,收脸的速度的也快了”,“牛顿法求解方程得到的解和初值间的距离居然和初值的导数值有关,导数值越小的初值解出来离初值越远,怎么回事呢?自己看书吧”,“不管怎么说,steffensen还是收敛的比较好的,相比没有他,我们离初值更近了╮(╯_╰)╭”

同学,你交大的吧,自己学一下matlab。

function x_star=newton(fname,dfname,x0,e,n)
if nargin<5
n=50;
end
if nargin<4
e=10^(-5);
end
digits(50);
x=x0;
x0=x+2*e;
k=0;
while abs(x0-x)>e
k=k+1;
if k>n
error('迭代失败');
return;
end
x0=x;
x=x0-feval(fname,x0)/feval(dfname,x0);
disp(x);
end
x_star=x;
disp(k);
end

兄弟你是选的赵海良的课呀?

求解一道matlab题,选了数值分析,结果悲惨的发现自己不会用matlab
求ln(x+sinx)=0的根。初值x0分别取0.1, 1,1.5, 2, 4进行计算 eq1 = @(x) log(x+sin(x));x10 = [.1,1.5,2,4];[x1,val1,flag1] = arrayfun(@(i)newton(eq1,x10(i)),1:length(x10));%未加速 [x1s,val1s,flag1s] = arrayfun(@(i)newton(eq1,x10(i),1),1:le...

大家帮忙用matlab计算一个数值积分,并列出命令行
1、梯形数值积分计算 trapz()X = 0:pi\/100:pi;Y = sin(X);Z = pi\/100*trapz(Y)2、自适应辛普森数值积分计算 quad()F = @(x)1.\/(x.^3-2*x-5);Q = quad(F,0,2);3、自适应Lobatto积分计算 quadl()function y = myfun(x)y = 1.\/(x.^3-2*x-5);end Q = quadl(...

试用matlab求如下数值积分(其中R,r为常量)
1、quad函数用于计算数值积分,函数表达式中不能包含符号量;2、被积函数的表达式应该写成关于被积变量的向量化的形式(也就是应该用点运算)。参考代码:R=1;syms L;rr = 0 : 0.1 : 1;for ii = 1 : length(rr) r = rr(ii); f = @(l)(acos((1+l*l-r*r)\/(2*l))+r*...

求大神帮做!用MATLAB编程数值分析的一道题目,请使用函数生成以下矩阵A...
A=[1 2 3;4 5 6;7 8 9]'B=[A(1,:) ;A(3,:)]

谁能帮我做一下关于数值分析的一道题,谢谢啦!用MATLAB
fxi_B= interp1(xi_A,fxi_A,xi_B,'linear'); %这是线性差值 fxi_C= interp1(xi_A,fxi_A,xi_B,'spline'); %这是?三次样条函数?fxi_D= interp1(xi_A,fxi_A,xi_B,'newton'); %这是?牛顿差值?或者可以参考 http:\/\/zhidao.baidu.com\/question\/146144659.html...

如何利用matlab求下列积分的数值解?
题1:可以这样解决。>> syms x >> Q=int(exp(-2*x)*cos(x)^3,0,2*pi)

求教大神用matlab数值解积分方程
这个方程无解。如果 |x| < 1,积分项会出现复数,而另一项为实数,无解。而当 |x| >= 1时,积分项的值大于0.5,另一项最大为0.5,仍然无解。可以很容易画出方程左端的函数图像:syms x e realezplot(int(sqrt(x^2-e^2),e,0,1)-1\/(x^2+1),[-2 2])由图可见,函数值始终为...

用matlab求解微分方程初值问题数值解和解析解,求解范围为区间.并画出...
用matlab求解微分方程初值问题数值解和解析解,可以这样处理:一、数值解 微分方程初值问题数值解可以用ode函数求解。首先,自定义微分方程的函数,即 dy = 3\/x*y+x^3*(exp(x)+cos(x))-2*x;其二,确定初始条件,即 y0=[(exp(pi)+2\/pi)*pi^3];其三,使用ode45函数,求出其数值解【x,y...

matlab 常微分数值解是指原函数么 有这么一道题:dy\/dx-2x=2x\/y;y...
dsolve('Dy-2x-2x\/y',',y(1)=0','x')返回的结果就是函数y了,这里不能写成y=...,可以用另外一个比如s代替。关于数值解,则是说求出y函数以后,带入一个数来求出来,可以用subs(y,'x',a),其中a是一个常数。

一道matlab积分题?
题主给出的分段被积函数,如何求其积分?第一步:根据函数表达式,用句柄函数或匿名函数,对其分段自定义,即 func1=@(x)exp(x.^2),【0,2】区间 func2=@(x)80.\/(4-sin(16*pi*x)),【2,4】区间 第二步:用数值积分函数quad1,分别计算 I1= quadl(func1,a,b,tol),这里a=0,b=...