问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-16 14:16

我来回答

4个回答

热心网友 时间:2023-10-25 09:10

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还是收敛的比较好的,相比没有他,我们离初值更近了╮(╯_╰)╭”

热心网友 时间:2023-10-25 09:10

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

热心网友 时间:2023-10-25 09:11

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

热心网友 时间:2023-10-25 09:12

兄弟你是选的赵海良的课呀?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见老婆光脚踩谷子 王者荣耀国服中,不论进入游戏还是没开始游戏,所有玩家发送的任何消息... 我的滴滴开空调活动怎么没了 为什么腾讯视频显示还是要流量看 没有联通中国结标志 电脑不能装win7买电脑时他们说只能装win10系统不能装win7 英雄联盟手游 手机lol游戏盒子现在叫什么? 英雄联盟手机盒子看不了比赛记录 手游英雄联盟视频在哪里看手机英雄联盟盒子在哪看我游戏中录的视频 英雄联盟盒子看视频只有声音没有画面,不是网速的问题,也不是电脑卡,是... 为什么英雄联盟盒子没发看视频 牛顿迭代与steffen迭代的区别 做网页中点左边的超链接 右边上面显示相应的标题 微信视频号怎么用搜索非好友,想看一个人的视频号,有了,但是用搜不到视频号_百度问一问 笔记本win10右下角图标消失无法上网,打开网络和internet会卡然后打不开 求js代码:点击链接提示设置首页,只提示一次怎么实现 和平精英黑号怎么来的 什么是立案,刑事案件的立案条件是什么,怎么立案 自制香肠怎样烹饪而成的? 鼠标旁边的提示信息JS代码怎么写 想制作视频和电子相册,那么问题来了从哪里下载 AE模板、PR模板、会声会影模板呢?求推荐 大禹治水代表什么 猜一个生肖 电脑桌面出现WLAN悬浮窗,如何去掉? 康佳电视开不了机怎么回事 voms助手删掉了怎么去掉桌面上的悬浮图标 初一真的有日语吗? 人教版日语必修一需要初中基础吗? 人教版初中日语是什么水平 人教版日语七年级教材多久讲完 人教版日语是几年级开始学的? 普通家用电烤箱都是单层吗? 高分悬赏matlab的一道题 为什么???MATLAB运行程序时为什么会说我的参数没有定义??怎么样才算定义啊? 查询身份证绑定多少个 肌肉一直紧张 无法放松 自己控制不了 怎样使自己很快入睡 头!发紧 发涨 深圳学校买的少儿医保怎么用 怎么查看手机号注册了几个 如何查询自己实名认证了多少个? 如何查询多出的注册 如何查看手机上登陆过几个? 脓包是什么 脓包是什么原因? 脓包还是什么? 银行代销的保险理财靠谱吗? 脓包是由什么构成的? 怎么知道自己有几个 脓包是怎样长成的?为什么会找脓包?有什么好方法消除脓包? 身上到处长脓包是什么原因? 微信怎么查名下有几个