?? 3point.m
字號:
function df=ThreePoint(func,x0,type,h)
if nargin == 3
h = 0.1;
else if (nargin == 4 && h == 0.0)
disp('h不能為0!');
return;
end
end
y0 = subs((func), findsym(sym(func)),x0);
y1 = subs((func), findsym(sym(func)),x0+h);
y2 = subs((func), findsym(sym(func)),x0+2*h);
y_1 = subs((func), findsym(sym(func)),x0-h);
y_2 = subs((func), findsym(sym(func)),x0-2*h);
switch type
case 1,
df = (-3*y0+4*y1-y2)/(2*h); %用第一個公式求導數
case 2,
df = (3*y0-4*y_1+y_2)/(2*h); %用第二個公式求導數
case 3,
df = (y1-y_1)/(2*h); %用第三個公式求導數
end
/*變步長龍格庫法求一階微分方程*/
#include "stdio.h"
#include "math.h"
double f(double,double);
main()
{
double y0=1,k1,k2,k3,k4,x0=0,h=0.1,h1=0.05,q,tol=0.1,y00,y01;
int i,n=10;
k1=f(x0,y0);
k2=f(x0+h/2,y0+h/2*k1);
k3=f(x0+h/2,y0+h/2*k2);
k4=f(x0+h/2,y0+h*k3);
y0=y0+h/6*(k1+2*k2+2*k3+k4);
y00=y0;
printf("the y00 is: %lf\n",y00); /*步長為h時從x0出發求一步得y00*/
k1=f(x0,y0);
k2=f(x0+h1/2,y0+h1/2*k1);
k3=f(x0+h1/2,y0+h1/2*k2);
k4=f(x0+h1/2,y0+h1*k3);
y0=y0+h1/6*(k1+2*k2+2*k3+k4);
x0=x0+h1;
k1=f(x0,y0);
k2=f(x0+h1/2,y0+h1/2*k1);
k3=f(x0+h1/2,y0+h1/2*k2);
k4=f(x0+h1/2,y0+h1*k3);
y0=y0+h1/6*(k1+2*k2+2*k3+k4);
y01=y0;
printf("the y01 is: %lf\n",y01); /*步長為h/2時從x0出發求倆步得y01*/
q=y01-y00; /*求y01和y00的差q*/
printf("the q is: %lf\n",q);
if(q>=tol) /*如果q≥允許的誤差tol,則反復將步長h減半,直至小于tol為止*/
{
while(q>=tol)
{
h=h/2;
k1=f(x0,y0);
k2=f(x0+h/2,y0+h/2*k1);
k3=f(x0+h/2,y0+h/2*k2);
k4=f(x0+h/2,y0+h*k3);
y0=y0+h/6*(k1+2*k2+2*k3+k4);
y00=y0;
h1=h1/2;
k1=f(x0,y0);
k2=f(x0+h1/2,y0+h1/2*k1);
k3=f(x0+h1/2,y0+h1/2*k2);
k4=f(x0+h1/2,y0+h1*k3);
y0=y0+h1/6*(k1+2*k2+2*k3+k4);
x0=x0+h1;
k1=f(x0,y0);
k2=f(x0+h1/2,y0+h1/2*k1);
k3=f(x0+h1/2,y0+h1/2*k2);
k4=f(x0+h1/2,y0+h1*k3);
y0=y0+h1/6*(k1+2*k2+2*k3+k4);
y01=y0;
q=y01-y00;
}
x0=0;
y0=0;
for(i=1;i<=n;i++) /*q小于tol,用最后一次步長套用公式解題*/
{
printf("the q, h,x0,y0 is: %lf\t%lf\t%lf\t%lf\n",q,h,x0,y0);
k1=f(x0,y0);
k2=f(x0+h/2,y0+h/2*k1);
k3=f(x0+h/2,y0+h/2*k2);
k4=f(x0+h/2,y0+h*k3);
y0=y0+h/6*(k1+2*k2+2*k3+k4);
printf("%lf\t%lf\t\n",x0,y0);
x0=x0+h;
}
}
Else /*如果q<允許的誤差tol,則反復將步長h加倍,直至大于tol為止*/
{
while(q<tol)
{
h=2*h;
k1=f(x0,y0);
k2=f(x0+h/2,y0+h/2*k1);
k3=f(x0+h/2,y0+h/2*k2);
k4=f(x0+h/2,y0+h*k3);
y0=y0+h/6*(k1+2*k2+2*k3+k4);
y00=y0;
h1=2*h1;
k1=f(x0,y0);
k2=f(x0+h1/2,y0+h1/2*k1);
k3=f(x0+h1/2,y0+h1/2*k2);
k4=f(x0+h1/2,y0+h1*k3);
y0=y0+h1/6*(k1+2*k2+2*k3+k4);
x0=x0+h1;
k1=f(x0,y0);
k2=f(x0+h1/2,y0+h1/2*k1);
k3=f(x0+h1/2,y0+h1/2*k2);
k4=f(x0+h1/2,y0+h1*k3);
y0=y0+h1/6*(k1+2*k2+2*k3+k4);
y01=y0;
q=y01-y00;
}
h=h/2;
for(i=1;i<=n;i++) /*q大于tol,用前一次一次步長套用公式解題*/
{
x0=0;
y0=0;
k1=f(x0,y0);
k2=f(x0+h/2,y0+h/2*k1);
k3=f(x0+h/2,y0+h/2*k2);
k4=f(x0+h/2,y0+h*k3);
y0=y0+h/6*(k1+2*k2+2*k3+k4);
printf("%lf\t%lf\t\n",x0,y0);
x0=x0+h;
}
}
}
double f(double x,double y) /*定義微分方程函數*/
{
double z;
z=y-2*x/y;
return z;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -