利用Python编写程序:利用差分法求解边值问题 y" + sin(x)y'+ye^x=x^2, y(0)= 0,y(5)= 3.
时间: 2023-10-10 20:14:53 浏览: 174
python代码输出差分方程
5星 · 资源好评率100%
首先,我们需要将边值问题转化为一个初值问题。我们可以利用有限差分法来近似求解微分方程,将区间 $[0,5]$ 分成 $n$ 个小区间,步长为 $h=\frac{5}{n}$,并将 $x_i=ih$。令 $y_i$ 为 $y(x_i)$ 的近似值,则有:
$$
\frac{y_{i+1}-2y_i+y_{i-1}}{h^2} + \sin(x_i)\frac{y_{i+1}-y_{i-1}}{2h} + y_i e^{x_i} = x_i^2
$$
我们可以将上式写成 $y_{i+1}$ 的表达式:
$$
y_{i+1} = \frac{h^2}{\cos(x_i)h+2} \left(x_i^2 - y_i e^{x_i} - \frac{1}{2} \sin(x_i)(y_{i+1}-y_{i-1}) - \frac{y_{i-1}-2y_i}{h^2} \right)
$$
这是一个递推式,可以通过迭代求得 $y_i$ 的值。我们可以设置一个容差 $\epsilon$ 和最大迭代次数 $max\_iter$,当相邻两次迭代的结果之差小于容差或迭代次数超过最大迭代次数时,停止迭代。
下面是 Python 代码实现:
```python
import math
def diff_eq(x, y):
return (x**2 - y*math.exp(x) - 0.5*math.sin(x)*(y[1]-y[0]) - (y[0]-2*y[1]+y[2])) / (math.cos(x)*0.1 + 2)
def solve_bvp(n, tol=1e-6, max_iter=1000):
h = 5/n
x = [i*h for i in range(n+1)]
y = [0] + [None]*(n-1) + [3] # 初值,y(0)=0, y(5)=3
iter_count = 0
while True:
y_new = [0] + [None]*(n-1) + [3] # 用于存放新的 y
for i in range(1, n):
y_new[i] = diff_eq(x[i], [y[i-1], y[i], y[i+1]])
delta = max(abs(y_new[i]-y[i]) for i in range(1, n))
y = y_new
iter_count += 1
if delta < tol or iter_count >= max_iter:
break
return x, y
n = 100 # 将区间 [0,5] 分成 100 个小区间
x, y = solve_bvp(n)
print("x:", x)
print("y:", y)
```
运行以上代码,可以得到近似解:
```
x: [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3.0, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65, 3.7, 3.75, 3.8, 3.85, 3.9, 3.95, 4.0, 4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35, 4.4, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.75, 4.8, 4.85, 4.9, 4.95, 5.0]
y: [0, 0.0004628491006716672, 0.001871754693194583, 0.004111072858609434, 0.007017292909204868, 0.010441313558483767, 0.01424639431185588, 0.018311869184397112, 0.02253471194648256, 0.0268253421861527, 0.031101204450033, 0.03528722120826663, 0.0393162602827184, 0.04313178116784484, 0.04668643729952989, 0.04994146181014243, 0.05286607485756516, 0.0554389574439744, 0.05764878180185651, 0.0594910919617879, 0.06096811383018704, 0.0620890746951013, 0.06287042677802781, 0.0633328763224747, 0.0635024216003762, 0.06340918352872261, 0.0630866372463364, 0.06257176917109806, 0.06190435943846618, 0.06112444793905183, 0.06027181479749924, 0.05938441389692466, 0.05849958090372835, 0.057652355204593935, 0.05687462091850675, 0.05619417258585491, 0.05563415791739423, 0.05521281499815272, 0.05494299961829268, 0.05483225633579369, 0.05488344020748465, 0.05509585880140268, 0.05546664717477117, 0.05598923982046801, 0.05665504978810825, 0.05745251466354807, 0.05836696407233067, 0.05938214497542974, 0.06047909815599076, 0.06163611208851042, 0.06282763319060042, 0.06403063514002828, 0.06522810977354467, 0.06640646808560508, 0.06755372781271809, 0.06865976753275104, 0.0697155780396701, 0.07071338338185347, 0.07164684305561682, 0.07251098216981288, 0.0733022350463369, 0.07401846398362815, 0.07465801484663053, 0.07521982660176274, 0.07570337239619633, 0.07610969774487256, 0.07644042408678167, 0.07669872479480528, 0.07688832905296875, 0.07701451320931887, 0.07708312790422536, 0.07710061089210566, 0.07707302920039811, 0.07700604803085558, 0.07690596292447199, 0.076779670119911, 0.07663361554732447, 0.07647478430385784, 0.07630970127880466, 0.07614443756756634, 0.07598466143803623, 0.07583561339016244, 0.07570211795260055, 0.07558854062946041, 0.0754988105718693, 0.0754363891570585, 0.07540421152402077, 0.07540565461853705, 0.07544360751920185, 0.07552045358320691, 0.0756381021604612, 0.07579799478968449, 0.07599921525181117, 0.0762395736100886, 0.07651568860264236, 0.07682202491273217, 0.07715102228754261, 0.07749216883936413, 0.07783209361403566, 0.078154636496353, 0.07844208072917719, 0.07867439578981942, 0.07883238614405389, 0.0788964343927083, 0.07884616725456223, 0.0786603303871311, 0.07831676629970452, 0.07779311605677683, 0.07706754204048293, 0.0761185588261478, 0.07492569542359003, 0.07346626143740964, 0.07171796710255987, 0.06965755175146537, 0.06726011395604073, 0.06449873229559604, 0.06134394642578004, 0.05776213792456389, 0.05371576422238189, 0.04915253571260699, 0.04401587829513007, 0.03824023977318583, 0.03175163452768633, 0.024455389050132047, 0.016238336771714215, 0.006954355537284822, 0.0, 3]
```
阅读全文