用matlab求y=f(x),y''=y^2的数值解,边界问题

作者&投稿:樊索 (若有异议请与网页底部的电邮联系)
用matlab求微分方程 y’=-y2+x, y(0)=1的数值解,怎么做啊。。。。~

function
[x,y]=Classical_RK4(odefun,xspan,y0,h,varargin)
x=xspan(1):h:xspan(2);
y(1)=y0;
for
k=1:length(x)-1
K1=feval(odefun,x(k),y(k),varargin{:});
K2=feval(odefun,x(k)+h/2,y(k)+h/2*K1,varargin{:});
K3=feval(odefun,x(k)+h/2,y(k)+h/2*K2,varargin{:});
K4=feval(odefun,x(k)+h,y(k)+h*K3,varargin{:});
y(k+1)=y(k)+h/6*(K1+K2+K3+K4);
end
x=x';y=y';
采用经典4阶龙格库塔方法计算,编写function函数,调用如下:
f=@(x,y)-y^2+x;
[x,y]=Classical_RK4(f,[0,5],1,0.1);
plot(x,y,'--*')

fun=@(x,y)y.*log10(y)-x创建关于x,y的匿名函数
log10(x)由于Matlab中自然对数的符号是log(与我们数学上的不同),以10为底的对数符号是log10,同理有log2,但是没有log3等哦
vpa将得到的符号解转化为指定精度的小数,比如vpa('sqrt(2)',10)将sqrt(2)表示10位精度的小数
fzero是Matlab求解一元函数零点的内置函数
fsolve是Matlab中求解方程组解(可以求解复数)的内置函数,功能强于fzero
fval是返回fun(x)的值,也就是说fzero和fsolve返回方程的解x,那么此时的fun(x)就是fval

这个方法比较多 可以数值也可以解析求解

1.解析求解

>> solve('y*log10(y)=3','y')

ans =

3*log(10)/lambertw(3*log(10))


>> vpa(ans)

ans =

4.5555357051951280236911974082484

2.数值解法这个可以使用fsolve和fzero,前者的功能更加强大,但是对于这个问题fzero就可以了

>>x=3;
>>fun=@(y)y*log10(y)-x;
%使用fsolve
>> [x,fval]=fsolve(fun,rand)
Optimization terminated: first-order optimality is less than options.TolFun.

x =

4.5555


fval =

3.9620e-008

%使用fzero
>> [x,fval]=fzero(fun,5)

x =

4.5555


fval =

-8.8818e-016

分析

这是个边值问题(BVP),不是初值问题。求解边值问题不能用ode系列函数,需要用专门的求解器。下面给你参考代码,涉及到的函数主要有bvpinit、bvp4c、deval,请自行参阅相关函数的说明。

 

参考代码

dydx = inline('[y(2); y(1)^2]', 'x', 'y');
bc = inline('[ya(1)-1; yb(2)]', 'ya', 'yb');
sol = bvpinit(linspace(0,100,50),[0 0]);
sol = bvp4c(dydx, bc, sol);
x = linspace(0,100);
y = deval(sol,x);

subplot 211
plot(x,y(1,:));
xlabel('Time (s)'); ylabel('y');
subplot 212
plot(x,y(2,:));
xlabel('Time (s)'); ylabel('y''');

 

结果



可以提供两种方法:
1:迭代法,通过自变量步长推进求解,有一定的算法。
2:MATLAB符号运算的自带函数dsolve,可以求出解符号表达式,用自变量的域代替就行了。
y=dsolve('D2y-3*Dy=x^2','Dy(0)=1','y(1)=0','x');
如果要求-10到10之间的解(Y值),可令步长为0.01
x=(-10:0.01:10);
y的解:
y=subs(y,'x',x)
欧拉法就是差分法,首先要给定定义域,然后离散定义域,给定边界条件,然后可以用显示推进或隐式迭代出每一个步长的Y值。一般可以先降阶,将二阶降到一阶。显式一班有如下形式:
for i=1:n
y 1= y + h*feval(f,t,y); % evaluate slope= feval(f,t,y);
t = t + h;
tF(i+1,:) = t; % store new values in arrays tF, yF
yF(i+1,:) = y.'; % Note: y values are stored as ROW of array yF
end

隐式有
for i=1:n
x=?
while abs(temp-y)>0.001
y=f(x)
temp=y
end
end


求y=x^3+x^2+1的极值matlab
如何用matlab求y=x^3+x^2+1的极值?对于一元高次函数的极值问题可以用fminbnd()函数求解。求解方法:1、自定义函数,即 fun=@(x)x^3+x^2+1;2、使用fminbnd局部极小值函数,可以得到 [x,fval]=fminbnd(fun,-1,1)这里,x为极值点;fval为局部极小值 3、运行结果 x=0;fval=1 ...

matlab数学软件中y=[y f]是什么意思
z是x和y的函数。一般来说x和y是N*N的。函数要求x,y,z的size是一样的。因此只能用类似mesh(x,y,z(:,:,i))来进行作图,如果写成循环的话,还能做成动画。y=[] 是定义一个空的数组,里面什么都没有,y=[y,1]就是把y 和 1组成一个矩阵数组把结果赋值给y 例如:y=[]; ,y=[y 1],...

matlab已知直线和x值,如何求y值
1、首先已知坐标(x0,y0)与(x1,y1),要得到[x0,x1]区间内某一位置x在直线上的值。2、然后由于x值已知,所以可以从公式得到y的值,已知y求x的过程与以上过程相同,只是x与y要进行交换。3、最后matlab已知直线和x值,即可求y值。

matlab如何计算一个函数的值
y=inline('x.^3 + x.^2 + x + 1','x');x=3;value=y(x)

matlab中,两个自变量的函数怎么求最大值(急!1) 请举例说明
需求:利用matlab求解二元函数 y=f(x1,x2)=(339-0.01*x1-0.003*x2)*x1 +(399-0.004*x1-0.01*x2)*x2-(400000+195*x1+225*x2) 的最大值 步骤:1、syms x1 x2;2、y=(339-0.01*x1-0.003*x2)*x1+(399-0.004*x1-0.01*x2)*x2-(400000+195*x1+225*x2) 得 y ...

matlab 求线性回归方程 y=a*b^x
X=[50 60 70 80 90];Y=[25.8 34.9 48.2 66.8 81.1];fun=inline('a(1)*a(2)^.X','a','X');a=lsqcurvefit(fun,[1,1],X,Y);>> plot(X,Y,'r',X,6.7667*1.0283.^X,'b')>> grid on

已知二元函数表达式,如何用matlab求当y等于某个数时,等于多少?
最简单,最直接,最暴力的做法 >> myx = solve('5=exp(-5*x)')myx = -1\/5*log(5)>> double(myx)ans = -0.3219 当然你非要找个文雅点的方法,也不是没有,如下:>> syms x y >> eq=exp(-5*x)-y;solve(eq,x)ans = -1\/5*log(y)>> subs(ans,5)ans = -0.3219 ...

用matlab解决: 试求y“=x的经过点m(0;1)且在此点一直线y=x\/2+1相切...
首先,算出积分曲线方程为y=(1\/6 )*x^3+(1\/2)*x+1 再编写代码如下:x=-1:0.1:1;y=(1\/6 )*x.^3+(1\/2)*x+1;z=(1\/2)*x+1;plot(x,y,x,z);得图:

用matlab求曲线y=x^3+x^2-5x 在区间 [1,10]内的曲线弧长
y2 = f(x(2:length(x))); % 第2到n个点的y坐标>> l = sum(sqrt(dx^2+(y2-y1).^2)) % 求出每一段长度并求总和l = 1.053249398296283e+003可以使用曲线积分 验证此结果:>> quad(@(x)sqrt(1+(3*x.^2+2*x-5).^2),1,10)ans = 1.053253012192356e+003 ...

用matlab,已知x的值,和f(x,y)=0的隐函数,如何求y
,[-2.23,2.23 0 1]);x1=get(h,'XData');y1=get(h,'YData');x=linspace(-2.23,2.23,100);y=interp1(x1,y1,x);hold on plot(x,y,'r')使用ezplot函数来实现吧。先画出图像,然后图像上取点进行插值。当然这样可能不够精确。要想更精确就给定一个x,然后只用数值方法求y。

蓝田县17053847205: 求高手用 MATLAB 编写一个程序,求以x,y为自变量的函数f(x,y)的值,f(x,y)定义如下 -
函庄美罗: (x,y)=x+y(x>=0&y>=0) f(x,y)=x+y*y(x>=0&y<0) f(x,y)=x*x+y(x<0,y>=0) f(x,y)=x*x+y*y(x<0&y<0)

蓝田县17053847205: 怎么用matlab 计算两个矩阵的函数关系 Y=f(X),已知两个矩阵 X 和 Y -
函庄美罗:[答案] 好像是没有办法求的.若硬要去求,答案也不会有唯一性. 如果X是个三阶的矩阵,Y是个四阶的,那更谈不上了.

蓝田县17053847205: matlab曲线拟合公式中含有两个变量,x是自变量,y既是自变量又是因变量,求指导,y=f(x,y) -
函庄美罗: 首先,将x、y看成同一变量,即x(1)、x(2) 然后,定义自变量函数,即fun=inline('x(2)-f(x(1),x(2))','a','x') %a是拟合系数 再用Matlab的nlinfit()函数或lsqcurvefit()函数进行拟合

蓝田县17053847205: matlab求曲线积分已知y=f(x),且给出了起止点,如何用matlab求解曲线的长度 -
函庄美罗:[答案]其中diff是符号求导函数,int是符号积分函数

蓝田县17053847205: MATLAB里,通过y=f(x)和一个x值得出一个y值,反过来怎样通过这个y值输出对应的x值?
函庄美罗: <p>如果知道函数的解析表达式,可以考虑试一试finverse,在一些简单的情况下,可能求出反函数的表达式.例如,</p> <p> syms x,finverse(1/tan(x))</p> <p>得到</p> <p> atan(1/x)</p> <p> </p><p>如果使用上面的finverse求反函数失败,可以...

蓝田县17053847205: 用matlab求f(x,y)=exp(2*x)*(x+y^2+2*y)的极值 -
函庄美罗: %建立两个.m文件 %建立表达式函数 function f=fun1(x) f=exp(2*x(1))*(x(1)+x(2)^2+2*x(2)) %x、y分别用x1和x2表示 %再建立一个.m文件 x0=[-1,-1] %给出猜测点 [x,f]=fminsearch('fun1',x0) 运行结果 x = 0.50001762331678 -0.99998701152312 f = -1.35914091292666 %matlab没有求极大值函数,因为把极小值取负即为极大值

蓝田县17053847205: MATLAB 如何解“x有多个值,y=f(x)”的方程? -
函庄美罗: 您提的问题只是个简单的赋值,根本称不上解方程.用下面的语句就可以了:x=0:0.001:1.5; y=x^2+1; 就是这么简单

蓝田县17053847205: 如何用matlab画f(x,y)函数图象? f(x,y)=x^2 - y+1 -
函庄美罗:[答案] [x,y]=meshgrid(-10:0.1:10); z=x.^2-y+1; mesh(x,y,z)

蓝田县17053847205: matlab如何实现复合函数的符号求导?已知y=y(x),f=f(y);想求df/dx,matlab里面的符号运算如何实现呢?由于我的表达式很复杂,要进行大量运算所以二次求... -
函庄美罗:[答案] sys x y f1=diff(y,x); f2=diff(f1,x); 可能是这样,你试一下.或者doc diff,看一下diff的用法,

蓝田县17053847205: 用MATLAB编程计算下列函数值并画出图形(1)y=f(x)=sinx/x (2) y=f(x)=(1+x)的1/x次方 -
函庄美罗:[答案] 1: syms x y; y=sin(x)./x; ezplot(y,[-10,10]); % -10,10是画图像x的取值范围,可以改. subs(y,x,2); % 计算x=2时的函数值.即sin(2)/2. 2. syms x y = (1+x).^(1./x); 后面同上.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网