tstart = 0;
tend = 0.08;
stepsize = 0.0008;
n = (tend - tstart)/stepsize;
(*DSolve*)
sol1 = DSolve[{l il'[t] == vl[t], c vc'[t] == ic[t],
ir[t] == -ic[t] + il[t], vl[t] == 24 - vc[t], vr[t] == vc[t],
vr[t] == r ir[t], il[0] == 0, vc[0] == 0}, {ir[t], il[t], ic[t],
vr[t], vl[t], vc[t]}, t];
{il[t_], vc[t_]} = {il[t], vc[t]} /. sol1[[1]];
pars1 = {r -> 22, l -> 2 10^-1, c -> 1 10^-4};
Da = NumberForm[Evaluate[il[t] /. pars1], {Infinity, 6}];
Db = NumberForm[Evaluate[vc[t] /. pars1], {Infinity, 6}];
Dil = Table[Da, {t, 0, 0.08, 0.0008}, 1];
Dvc = Table[Db, {t, 0, 0.08, 0.0008}, 1];
(*NDSolve*)
components1 = {vI == ll iL'[t] + vC[t],
vC'[t] == iL[t]/cc - vC[t]/(rr cc), vC[0] == 0, iL[0] == 0};
pars2 = {vI -> 24, rr -> 22, ll -> 2 10^-1, cc -> 1 10^-4};
sol2 = NDSolve[{components1} /. pars2, {iL, vC}, {t, 0, .2},
StartingStepSize -> stepsize,
Method -> {"FixedStep", Method -> {"LinearlyImplicitEuler"}}];
NDa = NumberForm[Evaluate[iL[t] /. sol2[[1]]], {Infinity, 6}];
NDb = NumberForm[Evaluate[vC[t] /. sol2[[1]]], {Infinity, 6}];
NDil = Table[NDa, {t, 0, 0.08, 0.0008}, 1];
NDvc = Table[NDb, {t, 0, 0.08, 0.0008}, 1];
(*求误差*)
ilerror = Table[0, {i, 0, n}];
vcerror = Table[0, {i, 0, n}];
For[k = 1, k < n + 2, k++,
ilerror[[k]] = Dil[[k, 1]] - NDil[[k, 1]];
vcerror[[k]] = Dvc[[k, 1]] - NDvc[[k, 1]];
];
ilerror
vcerror
上面是我的代码,主要的思路就是用DSolve和NDSolve两种方法分别求微分方程里的il和vc,然后计算两种方法的差值,用ilerror和vcerror来存。但我最后的结果没有把这个差值求出来,我试着给它加Evaluate或N等等,得到的还是两种方法得到的值相减的式子(如图片所示)。麻烦老哥指导下!
tend = 0.08;
stepsize = 0.0008;
n = (tend - tstart)/stepsize;
(*DSolve*)
sol1 = DSolve[{l il'[t] == vl[t], c vc'[t] == ic[t],
ir[t] == -ic[t] + il[t], vl[t] == 24 - vc[t], vr[t] == vc[t],
vr[t] == r ir[t], il[0] == 0, vc[0] == 0}, {ir[t], il[t], ic[t],
vr[t], vl[t], vc[t]}, t];
{il[t_], vc[t_]} = {il[t], vc[t]} /. sol1[[1]];
pars1 = {r -> 22, l -> 2 10^-1, c -> 1 10^-4};
Da = NumberForm[Evaluate[il[t] /. pars1], {Infinity, 6}];
Db = NumberForm[Evaluate[vc[t] /. pars1], {Infinity, 6}];
Dil = Table[Da, {t, 0, 0.08, 0.0008}, 1];
Dvc = Table[Db, {t, 0, 0.08, 0.0008}, 1];
(*NDSolve*)
components1 = {vI == ll iL'[t] + vC[t],
vC'[t] == iL[t]/cc - vC[t]/(rr cc), vC[0] == 0, iL[0] == 0};
pars2 = {vI -> 24, rr -> 22, ll -> 2 10^-1, cc -> 1 10^-4};
sol2 = NDSolve[{components1} /. pars2, {iL, vC}, {t, 0, .2},
StartingStepSize -> stepsize,
Method -> {"FixedStep", Method -> {"LinearlyImplicitEuler"}}];
NDa = NumberForm[Evaluate[iL[t] /. sol2[[1]]], {Infinity, 6}];
NDb = NumberForm[Evaluate[vC[t] /. sol2[[1]]], {Infinity, 6}];
NDil = Table[NDa, {t, 0, 0.08, 0.0008}, 1];
NDvc = Table[NDb, {t, 0, 0.08, 0.0008}, 1];
(*求误差*)
ilerror = Table[0, {i, 0, n}];
vcerror = Table[0, {i, 0, n}];
For[k = 1, k < n + 2, k++,
ilerror[[k]] = Dil[[k, 1]] - NDil[[k, 1]];
vcerror[[k]] = Dvc[[k, 1]] - NDvc[[k, 1]];
];
ilerror
vcerror
上面是我的代码,主要的思路就是用DSolve和NDSolve两种方法分别求微分方程里的il和vc,然后计算两种方法的差值,用ilerror和vcerror来存。但我最后的结果没有把这个差值求出来,我试着给它加Evaluate或N等等,得到的还是两种方法得到的值相减的式子(如图片所示)。麻烦老哥指导下!