作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Python3.11
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。
最后更新:2024年3月2日
【知识点】
差分方程、微分方程
【作业要求】
使用word文档或Markdown文档进行作答,使用Python编写程序,最终结果合并为一个word文档或Markdown文档,并另存为PDF格式进行提交。
注意:可以使用手机拍照文档进行提交,但请不要使用word文档直接进行提交。
【问题描述】
1. [习题2.9-P52] 求下列方程组的符号解和数值解:
{x2−y−x=3x+3y=2
要求:使用Python进行编程求解,并适当撰写说明文字。
备注:求数值解时,只能求得一组数值解。
答案及解析:
A. 符号解:
{x1=31−34y1=95+34,{x2=31+34y2=95−34
Python代码如下:
import sympy
sympy.var('x,y')
equ1 = sympy.Eq(3, x**2 - y - x)
equ2 = sympy.Eq(2, x + 3 * y)
solutions = sympy.solve((equ1, equ2), (x, y))
print(solutions)
[(1/3 - sqrt(34)/3, 5/9 + sqrt(34)/9), (1/3 + sqrt(34)/3, 5/9 - sqrt(34)/9)]
B. 数值解:
(1)根据Python编程习惯,定义一个数组变量 x 来表示 x,y,其形式为 x=[x,y]。
(2)将方程组转换为齐次方程组:
{x[0]2−x[1]−x[0]=3x[0]+3x[1]=2
(3)使用Python编程求解可得(备注:求数值解时,只能求得一组数值解):
x1=−1.6103,y1=1.2034 或 x2=2.2770,y2=−0.0923
from scipy.optimize import fsolve
import numpy as np
f = lambda x:[x[0]**2 - x[1] - x[0] - 3,
x[0] + 3*x[1] - 2]
solutions = fsolve(f, np.random.randn(2))
print(np.round(solutions, 4))
[ 2.277 -0.0923]
2. [习题2.11-P52] 已知 f(x)=(∣x+1∣−∣x−1∣)/2+sinx,g(x)=(∣x+3∣−∣x−3∣)/2+cosx,求下列方程组的数值解。
⎩⎨⎧2x1=3f(y1)+4g(y2)−13x2=2f(y1)+6g(y2)−2y1=f(x1)+3g(x2)−35y2=4f(x1)+6g(x2)−1
要求使用Python进行求解。
答案及解析:
(1)根据python的编程习惯,定义一个数组变量 z 用来表示 x1,x2,y1,y2,其形式为 z=[x1,x2,y1,y2]。
(2)将方程组转换为齐次方程组:
⎩⎨⎧3f(z2)+4g(z3)−1−2z0=02f(z2)+6g(z3)−2−3z1=0f(z0)+3g(z1)−3−z2=04f(z0)+6g(z1)−1−5z3=0
(3)使用Python编程求解可得:
x1=−0.8588,x2=−0.3022,y1=−0.8451,y2=0.0156
from scipy.optimize import fsolve
import numpy as np
f = lambda x: (abs(x+1) - abs(x-1))/2 + np.sin(x)
g = lambda x: (abs(x+3) - abs(x-3))/2 + np.cos(x)
equs = lambda z:[3*f(z[2]) + 4*g(z[3]) - 1 - 2*z[0],
2*f(z[2]) + 6*g(z[3]) - 2 - 3*z[1],
f(z[0]) + 3*g(z[1]) - 3 - z[2],
4*f(z[0]) + 6*g(z[1]) - 1 -5*z[3]]
solutions = fsolve(equs, np.random.rand(4))
print(np.round(solutions, 4))
[-0.8588 0.3022 -0.8451 0.0156]