![求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1,第1张 求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1,第1张](/aiimages/%E6%B1%82%E5%8A%A9%EF%BC%9A%E7%94%A8Matlab%E7%BC%96%E5%86%99%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95%E7%A8%8B%E5%BA%8F+%E6%98%AF%E5%85%B3%E4%BA%8E%E4%BA%8C%E5%85%83%E4%B8%80%E6%AC%A1%E6%96%B9%E7%A8%8B%E7%9A%84+y%3Dax1%2Bbx2%2Bc+y%3D%5Ba%2Cb%2Cc%2Cd%2Ce%2Cf%2Cg%5D+x1%3D%5Ba1%2Cb1%2Cc1%2Cd1.png)
y=[a,b,c,d,e,f,g]';
x1=[a1,b1,c1,d1,e1,f1,g1]';
x2=[a2,b2,c2,d2,e2,f2,g2]';
std=ones(7,1);%这里7代表有几个值,可以修改。eg,a—g就有7个值。
x=[std,x1,x2];%对应于y=c+ax1+bx2
[b,bint,r,rint,stats]=regress(y,x) %矩阵b的值就是c,a,b的值
这个有例子
区间二分法:
与对分查找法相同
1
区间二分法求出的仅仅是方程的一个单根,如果方程有重根或者多个根时,在做区间二分法时就会出现分叉,这样方程有几个根,就会产生几个实数序列,每一个实数序列的极限便是方程的一个根
2
通常用区间二分法为一些迭代法提供靠近x^的初始选代值;
3
区间二分法的缺点是不能求方程的复数根。
format
long
a=5;
b=6;
x1=a;
x2=b;
f1=4cos(x1)+4sin(x1)+05x1-2;
f2=4cos(x2)+4sin(x2)+05x2-2;
step=0000001;
ii=0;
while
abs(x1-x2)>step
ii=ii+1;
x3=(x1+x2)/2;
f3=4cos(x3)+4sin(x3)+05x3-2;
if
f3~=0
if
f1f3<0
x2=x3;
else
x1=x3;
end
end
end
x3
f=[4cos(x3)+4sin(x3)+05x3]
disp(['迭代次数:',num2str(ii),'次'])
牛顿迭代法求解:
在方程f(x)=0有实数根的情况下,若能够将方程等价地转化成x=g(x)的形式,然后取一个初始值x0代入x=g(x)的右端,算得x1=g(x0),再计算x2=g(x1),这样依次类推
x(k+1)=g(x(k))
可以得到一个序列xk,通常称g(x)为迭代函数,序列xk为由迭代函数产生得迭代序列,x0为迭代初始值。
同一个方程,不同等价形式的转换产生的迭代法可能收敛,也有可能发散.关于迭代法的敛散性判定有下面的定理(也称李普希兹(Lipschitz定理):
如果迭代函数g(x)在区间[a,b]上连续,且满足以下条件,
1
对于任意的x=[a,b],有g(x)=[a,b]
2
在区间内(a,b)内,函数g(x)满足Lipschitz条件,即存在常数L>0,使得对于任意的x,y=(a,b),都有|g(x)-g(y)|=
0000001
x0=x1;
x1=x1-(4(cos(x0)+sin(x0))+05x0-2)/(4(cos(x0)-sin(x0))+05);
end
f=4(cos(x1)+sin(x1)+05x1-2)
弦截法:
单点弦截法:
连接两个端点与作弦(a,f(a))
与(b,f(b))作弦,此弦与轴交点的横坐标设为
x1
如果f(x1)=0,则x1即为所求根,否则选取(x1,f(x1))点和点(a,f(a))(该点的选取要满足条件f(a)与f''(x)同号,并改记为(x0,f(x0))。再做弦
此弦与轴交点的横坐标设为
x2,依次类推,其迭代格式即为
xk+1=xk-f(xk)(xk-x0)/(f(xk)-f(x0)
双点弦截法:
无固定点
xk+1=xk-f(xk)(xk-xk-1)/(f(xk)-f(xk-1)
format
long
nx=[];
nx(1)=5;
nx(2)=nx(1)-(2^nx(1)-nx(1)^2-1)/(2^nx(1)log(2)-2nx(1));
k=1;
while
abs(nx(k+1)-nx(k))>=10^(-6)
k=k+1;
nx(k+1)=nx(k)-(2^nx(k)-nx(k)^2-1)/(2^nx(k)log(2)-2nx(k));
end
nk=k+1;
disp(['牛顿迭代法迭代次数:',num2str(nk),blanks(4),'方程的解:',num2str(nx(nk))])
dx=[];
dx(1)=5;
dx(2)=dx(1)-(2^dx(1)-dx(1)^2-1)/((2^3-3^2-1)-(2^5-5^2-1))(3-5);
k=1;
while
abs(dx(k+1)-dx(k))>=10^(-6)
k=k+1;
dx(k+1)=dx(k)-(2^dx(k)-dx(k)^2-1)/((2^dx(k)-dx(k)^2-1)-(2^5-5^2-1))(
dx(k)-5);
end
disp(['单点迭代法迭代次数:',num2str(k),blanks(4),'方程的解:',num2str(dx(k))])
sx=[];
sx(1)=5;
sx(2)=3;
k=1;
while
abs(sx(k+1)-sx(k))>=0000001
k=k+1;
sx(k+1)=sx(k)-((2^sx(k)-sx(k)^2-1)/((2^sx(k)-sx(k)^2-1)-(2^sx(k-1)-sx(k-1)^2-1)))(sx(k)-sx(k-1));
end
sk=k+1;
disp(['双点迭代法迭代次数:',num2str(sk),blanks(4),'方程的解:',num2str(sx(sk))])
x=3:005:5;
y=2^x-x^2-1;
yn=zeros(1,nk);
yd=zeros(1,sk);
subplot(1,2,1)
plot(x,y,sx,yd,'')
title('双点弦截法')
gtext('y=2^x-x^2-1')
subplot(1,2,2)
plot(x,y,nx,yn,'')
title('牛顿迭代法')
gtext('y=2^x-x^2-1')
close all;
clear;
clc;
x = zeros(40);
y = zeros(40);
x(1) = -2;
for i = 2 : 40
x(i+1) = x(i)+ 01;
end
for i = 1: 40
a= 1 - x(i)^3;
if (a == 0)
y(i) = 0;
elseif (a <0)
y(i) = - pow2(1/5log2(abs(a)));
elseif (a >0)
y(i) = pow2(1/5log2(abs(a)));
end
end
分好少啊,不过还是帮你做了吧,方法不一定是最好的,但是做出来了就行,再追加点分吧
function newton(x0,e,N)
%输入xo为估计的迭代初值,e为规定的误差,N为最大迭代次数
%输出x,y为最后迭代的两个近似根,k为迭代次数
clc
format long;
disp('迭代次数 近似根')
k=0;
x1=0;
x2=x0;
while (abs(x2-x1))>e
x1=x2;
x2=x1-f(x1)/df(x1);
k=k+1;
if k>N
return;
end
%%%%%%记录并输出%%%%%%%%%
o1=sprintf('%3d',k);
o2=sprintf('%38f',x2);
OL=[o1,' ' o2];
disp(OL);
y(k)=x2;
end
%%%%画图%%%%%%%
i=1:k;
figure(2)
plot(i,y,'rD-')
grid on
xlabel('迭代次数')
ylabel('近似根')
title(['牛顿法求出的该方程的近似根 x^=', num2str(x2,9)])
function y=f(x)
y=x^2/2-sin(x)-1;
function y=df(x)
y=x-cos(x);
第一种方法:利用dsolve函数求微分方程的符号解(通解):对于一些不是很难,要求出通解的微分方程,用dsolve函数求解。
1、 打开Matlab软件-->点击新建脚本菜单,新建一个脚本文件用于编写微分方程求解程序。
2、 输入微分方程求解程序-->点击保存-->点击运行。
3、在matlab的命令窗口即可看到求解结果,是一个关于参数a,b的表达式
第二种方法:利用Matlab中的solver函数(包括ode45、ode23、ode15s等)来求解微分方程的数值解,这种方法是最常用的方法,对于dsolve函数难以求解的方程就可以利用这种方法求解方程的数值解。
1、 打开Matlab-->新建一个脚本文件用于编写求解程序。
2、 在脚本文件中输入求解程序-->点击保存-->点击运行。
3、 这里需要先编写一个函数文件用于表示方程-->点击保存-->编写求解程序-->点击保存-->点击运行。
4、在figure页面就可以看到所求解的微分方程的图形。
以上就是关于求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1全部的内容,包括:求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1、求用MATLAB编制方程求根的二分法和Newton法的 Matlab 程序!!!谢谢~、matlab 代入法解方程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)