python作业求帮助
项目二正反相切抛物线题目给定1条开口朝上的抛物线和1条开口朝下的抛物线,2条抛物线相切,计算切点坐标和切线斜率,并绘制这2条抛物线以及切线。目的培养学生分析问题和编写简单...
项目二 正反相切抛物线
题目
给定1条开口朝上的抛物线和1条开口朝下的抛物线,2条抛物线相切,计算切点坐标和切线斜率,并绘制这2条抛物线以及切线。
目的
培养学生分析问题和编写简单程序的能力,主要考察Python基础语法以及numpy+matplotlib模块的使用。
要求
(1)所设计的程序能够正确运行;
(2)代码应遵照Python语言的变量、函数命名规则,加入适当的注释;
(3)成果形式:源代码+项目报告(教师制定报告模板),严禁抄袭;
(4)教师根据具体情况制定评分标准 展开
题目
给定1条开口朝上的抛物线和1条开口朝下的抛物线,2条抛物线相切,计算切点坐标和切线斜率,并绘制这2条抛物线以及切线。
目的
培养学生分析问题和编写简单程序的能力,主要考察Python基础语法以及numpy+matplotlib模块的使用。
要求
(1)所设计的程序能够正确运行;
(2)代码应遵照Python语言的变量、函数命名规则,加入适当的注释;
(3)成果形式:源代码+项目报告(教师制定报告模板),严禁抄袭;
(4)教师根据具体情况制定评分标准 展开
展开全部
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# File name: parabolic
# Project name: parabolic_equation
"""
.. moduleauthor::
.. Module.. name parabolic of procjet parabolic_equation
"""
from sympy import *
import matplotlib.pyplot as plt
import numpy as np
def _filterComplex(inputvalue, description='inputvalue'):
try:
str(inputvalue).index('I')
except ValueError:
return False
else:
return True
def _checkBool(inputvalue, description='inputvalue'):
"""
:param inputvalue:
:param description:
:return:
"""
if not isinstance(inputvalue, bool):
raise TypeError(
'The {0} must be boolean. Given: {1!r}'.format(description, inputvalue))
def _checkNumerical(inputvalue, description='inputvalue'):
"""
:param inputvalue:
:param description:
:return:
"""
try:
inputvalue + 1
except TypeError:
raise TypeError(
'The {0} must be numerical. Given: {1!r}'.format(description, inputvalue))
def _drawTowPara(expr_1, expr_2, inputmin, inputmax ,step=0.1):
"""
:param expr_1:
:param expr_2:
:param inputmin:
:param inputmax:
:param step:
:param expr_1_evalwithY:
:param expr_2_evalwithY:
:return:
"""
_checkNumerical(inputmin, 'xmin')
_checkNumerical(inputmax, 'xmax')
_checkNumerical(step, 'step')
y1List = []
x1List = []
y2List = []
x2List = []
if expr_1.vertical is True:
x1List = np.arange(inputmin, inputmax, step)
for x in x1List:
y1List.append(expr_1.evaluates_Y(x))
else:
y1List = np.arange(inputmin, inputmax, step)
for y in y1List:
x1List.append(expr_1.evaluates_X(y))
if expr_2.vertical is True:
x2List = np.arange(inputmin, inputmax, step)
for x in x2List:
y2List.append(expr_2.evaluates_Y(x))
else:
y2List = np.arange(inputmin, inputmax, step)
for y in y2List:
x2List.append(expr_2.evaluates_X(y))
plt.plot(x1List, y1List, '+')
plt.plot(x2List, y2List, '-')
plt.show()
def _solveCrossing(expr_1, expr_2):
"""
:param expr_1:
:param expr_2:
:return:
"""
x = Symbol('x')
y = Symbol('y')
print "Given the first expression: {0!r}".format(expr_1.expr)
print "Given the first expression: {0!r}".format(expr_2.expr)
ResultList = solve([expr_1.expr, expr_2.expr], [x, y])
Complex = False
ResultListTrue = []
for i in range(0, (len(ResultList)),1):
if _filterComplex(ResultList[i][0], 'x') or _filterComplex(ResultList[i][1], 'y'):
Complex = True
else:
ResultListTrue.append(ResultList[i])
if len(ResultListTrue) == 0 and Complex:
print "Two hyperbolic do not intersect, and there is imaginary value."
elif len(ResultListTrue) == 1:
print "Two hyperbolic tangent.:"
print ResultListTrue
else:
print "Two hyperbolic intersection, and Points are:"
for iterm in ResultListTrue:
print iterm
class Parabolic():
"""
"""
def __init__(self, a, b, c, vertical=True):
"""
:return:
"""
_checkNumerical(a, 'a')
_checkNumerical(b, 'b')
_checkNumerical(c, 'c')
_checkBool(vertical, 'vertical')
self.a = a
self.b = b
self.c = c
self.vertical = vertical
self.y = Symbol('y')
self.x = Symbol('x')
self.xarray = []
self.yarray = []
if vertical is True:
self.expr = (self.x**2)*self.a + self.x*self.b + self.c
else:
self.expr = (self.y**2)*self.a + self.y*self.b + self.c
def __repr__(self):
"""
:return:
"""
if self.vertical is True:
return "The Equation look like: {0!r}".format(self.expr)
else:
return "The Equation look like: {0!r}".format(self.expr)
def evaluates_X(self, inputvalue):
"""
:param inputvalue:
:return:
"""
_checkNumerical(inputvalue, 'y')
return self.expr.subs(self.y, inputvalue)
def evaluates_Y(self, inputvalue):
"""
:param inputvalue:
:return:
"""
_checkNumerical(inputvalue, 'x')
return self.expr.subs(self.x, inputvalue)
def getArrays(self, inputmin, inputmax, step=1):
"""
:param inputmin:
:param inputmax:
:param step:
:return:
"""
_checkNumerical(inputmin, 'xmin')
_checkNumerical(inputmax, 'xmax')
_checkNumerical(step, 'step')
if self.vertical is True:
for x in range(inputmin, inputmax, step):
self.xarray.append(x)
self.yarray.append(self.evaluates_Y(x))
else:
for y in range(inputmin, inputmax, step):
self.yarray.append(y)
self.xarray.append(self.evaluates_X(y))
def drawPara(self, inputmin, inputmax, step=1):
"""
:param inputmin:
:param inputmax:
:param step:
:return:
"""
_checkNumerical(inputmin, 'xmin')
_checkNumerical(inputmax, 'xmax')
_checkNumerical(step, 'step')
yList = []
xList = []
if self.vertical is True:
xList = np.arange(inputmin, inputmax, step)
for x in xList:
yList.append(self.evaluates_Y(x))
else:
yList = np.arange(inputmin, inputmax, step)
for y in yList:
xList.append(self.evaluates_X(y))
plt.plot(xList, yList, '+')
plt.show()
if __name__ == '__main__':
pa1 = Parabolic(-5,3,6)
pa2 = Parabolic(-5,2,5, False)
print pa1
print pa2
_solveCrossing(pa1, pa2)
_drawTowPara(pa1, pa2, -10, 10, 0.1)
# 这就是你想要的,代码解决了你的大部分问题,可以求两条双曲线交点,或者直线与双曲线交#点,或者两直线交点. 不过定义双曲线时候使用的是一般式.也也尽可能做了测试,如果有#问题的话,追问吧
追问
大神,没看懂,求请教
追答
不好意思阿,笔误,上面的文字说明里,所有的双曲线都应该改为抛物线,对不住阿。
抛物线的一般式为:
y=a*x²+b*x+c # 开口向上下 非水平 (也就是垂直)
和x=a*y2+b*y+c # 开口向左右 水平 (也就是非垂直)
可以发现参数的个数是不一样的,这样根据a,b,c, vertical 这四个变量我们可以定义任何的抛物线或者直线当a=0. 这些基本的数学道理相比没问题吧。
如果vertical 为真, a>0 时 开口向上 , a0 时 开口向右, a<0 时 开口向左
抛物线是一个类 Parabolic(), 输入规定的a,b,c, vertical 就行
然后我们就要交点了:_solveCrossing(抛物线A, 抛物线B),该函数会分析: 这两个抛物线有交点没,如果有,有几个? 只有一个就是相切,有两个就是相交。 如果交点为虚数,那意味着这两个抛物线不想交。 这些想必你也没问题吧。
然后就是画图了 _drawTowPara(抛物线A, 抛物线B, x轴最小值, x轴最大值, 最小刻度)
应该说解决了你的大部分问题了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询