#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编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)