用MTALAB编程实现四阶龙格库塔解二元二阶微分方程组

用MTALAB编程实现四阶龙格库塔解二元二阶微分方程组,第1张

#include<stdlibh>

#include<stdioh>

/n表示几等分,n+1表示他输出的个数/

int RungeKutta(double y0,double a,double b,int n,double x,double y,int style,double (function)(double,double))

{

double h=(b-a)/n,k1,k2,k3,k4;

int i;

// x=(double)malloc((n+1)sizeof(double));

// y=(double)malloc((n+1)sizeof(double));

x[0]=a;

y[0]=y0;

switch(style)

{

case 2:

for(i=0;i<n;i++)

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+hk1/2);

y[i+1]=y[i]+hk2;

}

break;

case 3:

for(i=0;i<n;i++)

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+hk1/2);

k3=function(x[i]+h,y[i]-hk1+2hk2);

y[i+1]=y[i]+h(k1+4k2+k3)/6;

}

break;

case 4:

for(i=0;i<n;i++)

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+hk1/2);

k3=function(x[i]+h/2,y[i]+hk2/2);

k4=function(x[i]+h,y[i]+hk3);

y[i+1]=y[i]+h(k1+2k2+2k3+k4)/6;

}

break;

default:

return 0;

}

return 1;

}

double function(double x,double y)

{

return y-2x/y;

}

//例子求y'=y-2x/y(0<x<1);y0=1;

/

int main()

{

double x[6],y[6];

printf("用二阶龙格-库塔方法\n");

RungeKutta(1,0,1,5,x,y,2,function);

for(int i=0;i<6;i++)

printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);

printf("用三阶龙格-库塔方法\n");

RungeKutta(1,0,1,5,x,y,3,function);

for(i=0;i<6;i++)

printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);

#include<stdlibh>

#include<stdioh>

/n表示几等分,n+1表示他输出的个数/

int RungeKutta(double y0,double a,double b,int n,double x,double y,int style,double (function)(double,double))

{

double h=(b-a)/n,k1,k2,k3,k4;

int i;

// x=(double)malloc((n+1)sizeof(double));

// y=(double)malloc((n+1)sizeof(double));

x[0]=a;

y[0]=y0;

switch(style)

{

case 2:

for(i=0;i<n;i++)

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+hk1/2);

y[i+1]=y[i]+hk2;

}

break;

case 3:

for(i=0;i<n;i++)

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+hk1/2);

k3=function(x[i]+h,y[i]-hk1+2hk2);

y[i+1]=y[i]+h(k1+4k2+k3)/6;

}

break;

case 4:

for(i=0;i<n;i++)

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+hk1/2);

k3=function(x[i]+h/2,y[i]+hk2/2);

k4=function(x[i]+h,y[i]+hk3);

y[i+1]=y[i]+h(k1+2k2+2k3+k4)/6;

}

break;

default:

return 0;

}

return 1;

}

printf("用四阶龙格-库塔方法\n");

RungeKutta(1,0,1,5,x,y,4,function);

for(i=0;i<6;i++)

printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);

return 1;

技巧:初学者可以使用高斯消元法,最基础和最直接的求解线性方程组的方法,其中涉及到三种对方程的同解变换:

(1)、把某个方程的k倍加到另外一个方程上去;

(2)、交换某两个方程的位置;

(3)、用某个常数k乘以某个方程。我们把这三种变换统称为线性方程组的初等变换。

任意的线性方程组都可以通过初等变换化为阶梯形方程组。由具体例子可看出,化为阶梯形方程组后,就可以依次解出每个未知数的值,从而求得方程组的解。

扩展资料:

高斯消元法的其他作用:

找出逆矩阵

高斯消元法可以用来找出一个可逆矩阵的逆矩阵。设A 为一个N N的矩阵,其逆矩阵可被两个分块矩阵表示出来。

将一个N N单位矩阵 放在A 的右手边,形成一个N 2N的分块矩阵B = [A,I] 。经过高斯消元法的计算程序后,矩阵B 的左手边会变成一个单位矩阵I ,而逆矩阵A ^(-1) 会出现在B 的右手边。

假如高斯消元法不能将A 化为三角形的格式,那就代表A 是一个不可逆的矩阵。

应用上,高斯消元法极少被用来求出逆矩阵。高斯消元法通常只为线性方程组求解。

计出秩的基本算法

高斯消元法可应用在任何m n的矩阵A。在不可减去某数的情况下,我们都只有跳到下一行。以一个6 9的矩阵作例,它可以变化为一个行梯阵式。

而矩阵中的 ' 是一些数字。这个梯阵式的矩阵T 会有一些关于A的资讯:

A 的秩是5,因为T 有5行非0的行;

A 的列的向量空间,可从A 的第1、3、4、7和9列中得知,其数值在矩阵T 之中;

矩阵中的 ' 表示了A 的列可怎样写为列中的数的组合。

参考资料来源:百度百科--高斯消元法

参考资料来源:百度百科--行列式

编写一个函数,一个主程序,

第一个

function dy=fun(t,y)

dy=zeros(2,1);

dy(1)=y(2);

dy(2)=-sin(y(1));

保存为funm

第二个主函数

tspan=[0,2];y0=[1;1];

[t,y]=ode45('fun',tspan,y0);

plot(t,y(:,1));

保存为mainm

运行mainm文件即可

别忘了加分呀,要是有什么不懂的我们还可以继续交流

以上就是关于用MTALAB编程实现四阶龙格库塔解二元二阶微分方程组全部的内容,包括:用MTALAB编程实现四阶龙格库塔解二元二阶微分方程组、求四阶行列式计算技巧!初学者什么都不懂!、四阶R-K求常微分方程初值的matlab编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10206667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存