精华内容
下载资源
问答
  • 高等数学常见曲线

    2011-12-07 08:21:31
    常见的高等数学曲线,包括阿基米德螺线、三叶玫瑰线、摆线等等,很详细哦
  • Mathematica绘制常见曲线

    万次阅读 2016-05-05 15:24:33
    本文主要用于展示自己使用mathematica绘制的数学上的常见和常用曲线(本来是动图的,只因技术不精,变成静图了)阿基米德螺线Manipulate[ PolarPlot[a t, {t, -2 \[Pi], 2 \[Pi]}, PlotTheme -> "Detailed", ...

    Mathematica绘制常见曲线

    才疏学浅,资历欠佳,难免有误,望有心人批评指正。

    border="0" width="350" height="100" src="http://music.163.com/outchain/player?type=2&id=412493245&auto=1&height=66">

    本文主要用于展示自己使用mathematica绘制的数学上的常见和常用曲线(本来是动图的,只因技术不精,变成静图了)

    阿基米德螺线

    Manipulate[
     PolarPlot[a t, {t, -2 \[Pi], 2 \[Pi]}, PlotTheme -> "Detailed",
      AxesStyle -> Arrowheads[{0, 0.03}], PlotLabel -> "阿基米德螺线",
      PlotLegends -> None], {a, -1, 1}]

    阿基米德螺线

    Manipulate[
     PolarPlot[a Sin[3 t], {t, 0, Pi}, PlotTheme -> "Web",
      AxesStyle -> Arrowheads[{0, 0.03}]], {a, -1, 1}]


    这里写图片描述
    只是觉得好看,并非我所画

    PolarPlot[
     Evaluate[Table[
       Abs[Sin[\[Theta] + i]], {i, 0, 2 Pi, 2 Pi/16}]], {\[Theta], 0,
      2 Pi}, PlotStyle -> Thick,
     ColorFunction -> Function[{x, y, t, r}, Hue[r]], Axes -> False,
     RegionFunction -> Function[{x, y, t, r}, r < 0.555],
     ColorFunctionScaling -> False, PlotPoints -> 20, MaxRecursion -> 3]


    这里写图片描述

    伯努利双纽线

    Manipulate[
     ContourPlot[(x^2 + y^2)^2 == 2 a^2 x y, {x, -1, 1}, {y, -1, 1},
      AspectRatio -> Full, PlotTheme -> "Scientific",
      PlotLabel -> "伯努利双纽线", AxesStyle -> Arrowheads[{0, 0.03}]], {a, -1,
      1}]


    这里写图片描述

    四叶玫瑰线

    Manipulate[
     PolarPlot[a Sin[2 t], {t, -2 Pi, 2 Pi}, PlotTheme -> "Detailed",
      AxesStyle -> Arrowheads[{0, 0.03}], AspectRatio -> Full,
      PlotStyle -> {Red, Dashed}, PlotLabel -> "四叶玫瑰线",
      PlotLegends -> Automatic], {a, -1, 1}]


    这里写图片描述

    Manipulate[
     PolarPlot[a Sin[2 t], {t, -2 Pi, 2 Pi}, PlotTheme -> "Detailed",
      AxesStyle -> Arrowheads[{0, 0.03}], AspectRatio -> Full,
      PlotStyle -> {Purple, Thickness[0.003]}, PlotLabel -> "四叶玫瑰线",
      PlotLegends -> Automatic], {a, -1, 1}]


    这里写图片描述

    做出图像并求解积分

    Plot[1/(1 + x^2), {x, -15, 15}, PlotTheme -> "Detailed",
     PlotRange -> All, PlotRangePadding -> Scaled[.05], Filling -> Axis,
     FillingStyle -> {Opacity[0.7], Pink}]


    这里写图片描述

    Integrate[1/(1 + x^2), {x, -Infinity, Infinity}]

    仅供学习参考与交流

    展开全文
  • 后面我们将介绍几种常见数学建模算法的python实现,旨在展示python在本领域的强大威力。1问题描述你希望通过几种常见算法的实现,了解python在数学建模中的能力。2解决方案python除了丰富的原生数据结构外,拥有强大...

    89725653b39af1d8b5bdcc2f5c1966ba.gif

    在数学建模中主流的编程语言是MATLAB,但随着python/R中数学软件包的不断完善,熟悉这两种编程语言的同学也可以快速数学建模的编程环节。后面我们将介绍几种常见数学建模算法的python实现,旨在展示python在本领域的强大威力。

    1

    问题描述

    你希望通过几种常见算法的实现,了解python在数学建模中的能力。

    2

    解决方案

    python除了丰富的原生数据结构外,拥有强大的第三方软件包支持,例如矩阵运算库Numpy,数据处理库Pandas、机器学习库Sklearn、深度学习库Tenserflow&Pytorch、科学计算库Scipy、图形绘制库matplotlib、网络算法库Networkx。此外几乎针对任何领域,都有第三方软件包的支持,这归功于python优秀的社区。使用者需要使用好pip这一软件包管理工具,发掘前人造好的轮子,尽量减少自己编程的难度。我们将在后面的问题讨论中介绍以下几种常用数学建模算法的python实现:

    1.数据拟合算法2.插值算法3.线性规划算法4.单源多宿最短路算法

    3

    问题讨论

    我们的重点在于代码实现而非数学推导

    1.数据拟合算法

    我们这里介绍通过最小二乘法拟合线性函数

    #我们使用最小二乘法拟合一个三次函数,选取了5个参数

    import numpy as np

    import matplotlib.pyplot as plt

    SAMPLE_NUM = 100

    M = 5

    x = np.arange(0, SAMPLE_NUM).reshape(SAMPLE_NUM, 1) / (SAMPLE_NUM - 1) * 10

    y = 2*x**3+3*x**2+x+1

    plt.plot(x, y, 'bo')

    X = x

    for i in range(2, M + 1):

    X = np.column_stack((X, pow(x, i)))

    X = np.insert(X, 0, [1], 1)

    W=np.linalg.inv((X.T.dot(X))).dot(X.T).dot(y)

    y_estimate = X.dot(W)

    plt.plot(x, y_estimate, 'r')

    plt.show()

    07017502089b37792d284d4e043b9451.png

    2.插值算法我们使用几种常见的插值函数拟合上例中的三次函数

    import numpy as np

    from scipy import interpolate

    import pylab as pl

    x=np.linspace(0,10,11)

    y=2*x**3+3*x**2+x+1

    xInset=np.linspace(0,10,101)

    pl.plot(x,y,"ro")

    for kind in["nearest","zero","slinear","quadratic","cubic"]:

    f=interpolate.interp1d(x,y,kind=kind)

    y_estimate=f(xInset)

    pl.plot(xInset,y_estimate,label=str(kind))

    pl.legend(loc="lower right")

    pl.show()

    02641c63ca54078aedc95ff811cfe98c.png

    3.线性规划算法我们可以使用scipy库对目标函数进行线性规划

    import numpy as np

    from scipy.optimize import minimize

    def func(x):

    return(2*x[0]*x[1]+2*x[0]-x[0]**2+2*x[1]**2+np.sin(x[0]))

    cons=({"type":"eq","fun":lambda x:np.array([x[0]**3-x[1]]),"jac":lambda x:np.array([3*(x[0]**2),-1.0])},{"type":"ineq","fun":lambda x:np.array([x[1]-1]),"jac":lambda x:np.array([0,1])})#定义函数的多个约束条件

    res=minimize(func,[-1.0,1.0],constraints=cons,method="SLSQP",options={"disp":True})

    print(res)

    注意这里求解的为目标函数最小值,如果我们需要求解最大值则将func取负数即可。输出内容如图

    cdc9e734c6dee4fffb525738ba69d1b3.png

    4.单源多宿最短路算法我们介绍以下基于堆优化的dijkstra算法,这里的堆可以使用python内置的PriorityQueue实现。我们这里给出一个简单的堆实现:

    classDisNode:

    def __init__(self,node,dis):

    self.node=node

    self.dis=dis

    def __lt__(self, other):

    return self.dis

    classDisPath:

    def __init__(self,end):

    self.end=end

    self.path=[self.end]

    self.dis=0

    def __str__(self):

    nodes=self.path.copy()

    return"->".join(list(map(str,nodes)))+" "+str(self.dis)

    classHeap:

    def __init__(self):

    self.size=0

    self.maxsize=10000

    self.elements=[0]*(self.maxsize+1)

    def isEmpty(self):

    return self.size==0

    def insert(self,value):

    if self.isEmpty():

    self.elements[1]=value

    else:

    index=self.size+1

    while(index!=1and value2]):

    self.elements[index]=self.elements[index//2]

    index=index//2

    self.elements[index]=value

    self.size+=1

    def pop(self):

    deleteElement=self.elements[1]

    self.elements[1]=self.elements[self.size]

    self.size-=1

    temp=self.elements[1]

    parent,child=1,2

    while(child<=self.size):

    if childand self.elements[child]>self.elements[child+1]:

    child+=1

    if temp

    break

    else:

    self.elements[parent]=self.elements[child]

    parent=child

    child*=2

    self.elements[parent]=temp

    return deleteElement

    defDijkstraWithHeap(nodes,start,GetNeighbors):

    dis=defaultdict(int)

    paths=defaultdict(DisPath)

    heap=Heap()

    visit=set()

    for node in nodes:

    dis[node]=sys.maxsize

    paths[node]=DisPath(node)

    dis[start]=0

    heap.insert(DisNode(start,0))

    while(not heap.isEmpty()):

    now=heap.pop().node

    if now in visit:

    continue

    visit.add(now)

    paths[now].dis=dis[now]

    for edge inGetNeighbors(now):

    end=edge.End

    if dis[now]+edge.value

    dis[end]=dis[now]+edge.value

    paths[end].path=paths[now].path+[end]

    heap.insert(DisNode(end,dis[end]))

    return paths

    通过堆优化的dijkstra算法的时间复杂度最低可以达到O(nlogm),上文给出的代码的时间复杂度为O(mlogm),但是胜在编码简单。此外还可以使用Networkx库进行求解,这里不再介绍。

    各赛区成绩陆续更新敬请期待

    点击下方图片,了解相关你感兴趣的活动

    341f9b6eec3cb66e340e0d2495914fef.gif

    0ae3d0ae4595f36b2d76b7312bd5596b.png

    213eefc96f5fb05bfc03a63778086381.png

    edcdf515283816537077bfafbd8e4632.png

    a041b69b6ede244297ceac9900f1178a.png

    884955ce4f14eca7148fae2d5ce2984e.gif

    fc14d88d2d3c9c0eb21f289ccd7534f5.png

    文章来源:numen智能研究院

    1dbc0121f9c6e54689ea54965711e07a.png

    展开全文
  • 可以在一个坐标系中绘制多条数学曲线 显示坐标轴,网格,刻度值,图例 可以选择不同颜色线型来绘制不同的曲线 当鼠标移动到曲线上某点时,可以显示该点的坐标 可以用鼠标拖动图像 可以进行图形的放大,缩小,...

    实验环境

    • window 10 版本19041
    • Microsoft Visual Studio Community 2019 版本 16.6.4

    实现功能

    • 绘制常见函数的图像
    • 支持普通函数,极坐标函数,参数方程,直接输入数据点
    • 可以删除指定函数图像
    • 可以在一个坐标系中绘制多条数学曲线
    • 显示坐标轴,网格,刻度值,图例
    • 可以选择不同颜色线型来绘制不同的曲线
    • 当鼠标移动到曲线上某点时,可以显示该点的坐标
    • 可以用鼠标拖动图像
    • 可以进行图形的放大,缩小,定量设置显示范围,自动缩放
    • 普通函数x取值范围可设置为跟随显示范围变化
    • 状态栏实时显示鼠标位置,双击显示鼠标精确位置
    • 重要数据的序列化和反序列化
    • 突变函数(如floor(x)floor(x))和部分y值接近无穷的函数(如tan(x)tan(x))无法完美显示

    界面展示

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    设计结构

    程序流程及设计

      用户输入函数信息,显示函数图像。还可以通过菜单和工具栏更改设置。

      通过计算样本点,相邻样本点用直线连接,当样本点数量足够大时,可近似看成曲线。
    在这里插入图片描述

    在这里插入图片描述

    程序所有源文件

    在这里插入图片描述

    CalculatorFunc.cpp介绍

    double CalcEquation(CString m_sEquation, bool& succ, char xKey, double xVal)
    m_sEquation:表达式
    succ:计算是否成功
    xKey:未知数是"x"还是"t"
    xVal:未知数的值

    此文件可以单独拿出来(把CString换成string就行)使用
    bool succ = true;
    double ans = CalcEquation(“sin(x)+e^x”,succ,‘x’,1.1);

     对方程,分为数(常数,未知数x),双目运算符(+ , - ,* , / , ^ ) ,单目运算符(sin,cos等等),单目运算符后面是一个完整的子式,如2+cos(x+1)中,x+1就是一个完整的式子,通过递归调用可以求子式的值,如果已知子式值,这个[单目运算符+子式]就是一个已知数了,那剩下的就等效于只有+ , - , * , / , ^ 的公式,用表达式栈法就可以解决。

    FuncData.cpp介绍

    在这里插入图片描述

    FuncData类
    成员变量:
    	int FuncCas;            //函数类型
    	CString m_Equation;		//函数表达式
    	double minX, maxX;		//x极值
    	double maxY, minY;		//y极值
    	int stepX;				//可以理解为样本点的数量
    	int m_penWidth;			//画笔宽度
    	int m_penType;			//画笔类型
    	COLORREF m_color;		//画笔颜色
    	vector<pair<double, double> > vetPoint;			 //储存所有样本点
    成员函数:
    	virtual double GetY(double xVal, bool& succ) = 0;//得到未知数为xVal时函数值,succ表示计算是否成功
    	virtual bool CalcList() = 0;					 //计算vetPoint
    	virtual bool GetNearest(pair<double,double> NowPoint, pair<double, double> &CmpPoint);//获取本函数与NowPoint最近的点
    	virtual CString GetEquation2();					 //为了得到参数方程第二个函数式
    	FuncData();
    	FuncData(CString Equation,double minX,double maxX,int stepX,COLORREF color, int penWidth,int penType);//构造函数
    
    注意:此处派生类只记录特有的成员
    NormalFD类
    无
    
    PolarFD 类
    成员变量
    double maxth, minth;   //自变量θ取值范围
    
    TwoFD类
    成员变量
    CString m_EquationY;
    double maxT, minT;
    成员函数
    double GetX(double tVal, bool& succ);//参数方程X也需要求值
    	virtual double GetY(double tVal, bool& succ);
    
    DataFD类
    成员函数
    	static int DataFD_Cnt;  //记录数据点类型函数数量
    
    mfcplotDoc.cpp介绍

     mfcplotDoc中记录着设置信息和函数数据,主要内容如下

    public:
    	bool m_WillShowGrid; //是否显示网格
    	bool m_WillShowAxis; //是否显示坐标轴
    	bool m_WillShowEdge; //是否显示边框
    	bool m_SingelMode;   //单函数模式添加函数自动删除上一个函数
    	bool m_ForceXrange;	 //普通函数x范围是否固定,不固定的话随显示范围变化
    	bool m_ShowNearPoint;//鼠标接近函数线时是否显示其坐标
    	double m_Xmin, m_Xmax, m_Ymin, m_Ymax;//显示范围
    	FuncData *m_FD;//临时变量
    	CObList m_List;//记录所有函数信息
    public:
    	afx_msg void OnAxisMenu();//坐标轴
    	afx_msg void OnGridMenu();//网格
    	afx_msg void OnEdgeMenu();//边框
    	afx_msg void OnSmallerMenu();//显示范围缩小 0.8
    	afx_msg void OnBiggerMenu();//显示范围放大 1.25
    	afx_msg void OnNormalFuncMenu();//增加普通函数
    	afx_msg void OnMenuSetXyrange();//设置显示范围
    	afx_msg void OnFuncMode();//单/多函数模式
    	afx_msg void OnPolarFuncMenu();//增加极坐标函数
    	afx_msg void OnTwoFuncMenu();//增加参数方程函数
    	afx_msg void OnDataFuncMenu();//增加数据点型函数
    	afx_msg void OnFroceXrang();//普通函数x范围是否固定
    	afx_msg void OnNearpointMenu();//是否显示最近点
    	afx_msg void OnAutorangeMenu();//自动调整显示范围,正好显示完整函数图像
    	afx_msg void OnDelfunconeMenu();//删除一个函数
    	afx_msg void OnDelallMenu();//删除所有函数
    
    mfcplotView.cpp介绍

     绘图逻辑是在这里实现的,主要内容如下

    public:
    	double m_Xmin, m_Xmax, m_Ymin, m_Ymax;//函数显示范围
    	int nTop, nButton, nLeft, nRight;//对应的逻辑坐标范围
    	int isMoving;//拖动状态 0不拖动 1拖动模式 2正在拖动
    	double tmp_Xmin, tmp_Xmax, tmp_Ymin, tmp_Ymax;
    	//拖动模式下,单击鼠标左键,记录起点的显示范围
    	CPoint m_posStart;
    	//拖动模式下,单击鼠标左键,记录起点的鼠标坐标
    	//根据鼠标坐标偏移量可以计算显示范围变化量
    

     函数中LPxtoFPx表示把函数坐标x变成pDC可以用的逻辑坐标_x,原理函数坐标范围m_Xmin,m_Xmax到逻辑坐标范围nLeft,nRight(下面函数会给出)等比例的映射。

    double CmfcplotView::LPxtoFPx(int x) {
    	return m_Xmin + (1.0 * x - nLeft) * (m_Xmax - m_Xmin) / (1.0 * nRight - nLeft);
    }
    

     实现坐标转换后就可以进行绘图工作了。

    void CmfcplotView::OnDraw(CDC* pDC)
    {
    	CmfcplotDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    	m_Xmin = pDoc->m_Xmin;//极值保存在Doc中
    	m_Xmax = pDoc->m_Xmax;
    	m_Ymin = pDoc->m_Ymin;
    	m_Ymax = pDoc->m_Ymax;
    	
    	CRect rect;
    	GetClientRect(&rect);//获得视图区
    
    	nTop = (int)round(rect.bottom * 0.1);  //函数图像不会占据整个视图区
    	nButton = (int)round(rect.bottom * 0.9);
    	nLeft = (int)round(rect.right * 0.1);
    	nRight = (int)round(rect.right * 0.9);
    
    	if (pDoc->m_WillShowEdge) {//画边框
    		pDC->MoveTo(nLeft, nTop);
    		pDC->LineTo(nLeft, nButton);
    		pDC->LineTo(nRight, nButton);
    		pDC->LineTo(nRight, nTop);
    		pDC->LineTo(nLeft, nTop);
    	}
    
    	//画x坐标信息
    	int nX,nY;
    	bool BIGX = abs(m_Xmin) > 100 || abs(m_Xmax) > 100;//x坐标值比较大时,标注更稀
    	for (nX = nLeft; nX < nRight; nX += (BIGX ? 100 : 50)) { //每隔100/50像素一个标注
    		CRect textRect(nX - (BIGX ? 50 : 25), nButton + 1, nX + (BIGX ? 50 : 25), nButton + 20);//显示区域
    		CString xInfo;
    		xInfo.Format(_T("%.2f"),LPxtoFPx(nX));
    		pDC->DrawText(xInfo, &textRect, DT_SINGLELINE | DT_CENTER);
    		                                    //单行,上下左右居中显示
    	}
    	if (nX - nRight <= (BIGX ? 50 : 25)) {//最后一个x坐标,与前一个标注距离太近则不显示
    		CRect textRect(nRight, nButton + 1, nRight + 50, nButton + 20);
    		CString xInfo;
    		xInfo.Format(_T("%.2f"),m_Xmax);
    		pDC->DrawText(xInfo, &textRect, DT_SINGLELINE | DT_LEFT | DT_TOP);
    	}
    
    	//y坐标
    	for (nY = nButton - 50; nY > nTop; nY -= 50) {
    		CRect textRect(nLeft - 200, nY-10, nLeft - 3, nY + 10);
    		CString yInfo;
    		yInfo.Format(_T("%.2f"), LPytoFPy(nY));
    		pDC->DrawText(yInfo, &textRect, DT_SINGLELINE | DT_RIGHT);
    	}
    	if (nTop - nY <= 25) {
    		CRect textRect(nLeft - 200, nTop - 10, nLeft - 3, nTop + 10);
    		CString yInfo;
    		yInfo.Format(_T("%.2f"),m_Ymax);
    		pDC->DrawText(yInfo, &textRect, DT_SINGLELINE | DT_BOTTOM | DT_RIGHT);
    	}
    
    
    	//  显示网格
    	if (pDoc->m_WillShowGrid) {
    		CPen pen(PS_DOT, 1, RGB(100, 100, 100));           //创建笔,虚线,并调整坐标颜色灰色
    		CPen *pOldPen = (CPen *)pDC->SelectObject(&pen);
    		for (nX = nLeft+50; nX < nRight; nX += 50) {
    			pDC->MoveTo(nX, nTop);
    			pDC->LineTo(nX, nButton);
    		}
    		for (nY = nButton - 50; nY > nTop; nY -= 50) {
    			pDC->MoveTo(nLeft, nY);
    			pDC->LineTo(nRight, nY);
    		}
    		pDC->SelectObject(pOldPen);
    	}
    
    	// 显示坐标轴
    	if (pDoc->m_WillShowAxis) {
    		CPen pen(PS_SOLID, 2, RGB(0, 0, 0));
    		CPen* pOldPen = (CPen*)pDC->SelectObject(&pen);
    		int oX = FPxtoLPx(0);
    		int oY = FPytoLPy(0);
    		bool showY = oX >= nLeft && oX <= nRight;
    		bool showX = oY >= nTop && oY <= nButton;//判断x,y轴是否在范围内
    		if (showX) {
    			pDC->MoveTo(nLeft - 10, oY);
    			pDC->LineTo(nRight + 10, oY);
    		}
    		if (showY) {
    			pDC->MoveTo(oX, nButton + 10);
    			pDC->LineTo(oX, nTop - 10);
    		}
    		if (showX && showY) {
    			pDC->TextOutW(oX + 1, oY + 1, _T("O"));
    		}
    		if (showX) {
    			pDC->MoveTo(nRight + 10, oY);
    			pDC->LineTo(nRight + 5, oY + 5);
    			pDC->MoveTo(nRight + 10, oY);
    			pDC->LineTo(nRight + 5, oY - 5);
    			pDC->TextOutW(nRight + 10, oY, _T("X轴"));
    		}
    		if (showY) {
    			pDC->MoveTo(oX, nTop - 10);
    			pDC->LineTo(oX - 5, nTop - 5);
    			pDC->MoveTo(oX, nTop - 10);
    			pDC->LineTo(oX + 5, nTop - 5);
    			pDC->TextOutW(oX + 5, nTop - 10, _T("Y轴"));
    		}
    		pDC->SelectObject(pOldPen);
    	}
    
    	
    	POSITION p = pDoc->m_List.GetHeadPosition();
    
    	int showTop = nTop;
    	while (p != nullptr) {
    		bool shouldMov = true;//一段曲线第一个点MoveTo,其他都是LineTo
    		FuncData* tmpFD = (FuncData*)pDoc->m_List.GetNext(p);
    		CPen pen(tmpFD->m_penType, tmpFD->m_penWidth, tmpFD->m_color);
    		CPen* pOldPen = (CPen*)pDC->SelectObject(&pen);
    
    		if (tmpFD->FuncCas == CAS_NORMAL) {//动态X坐标模式下,普通函数x范围与视图不同时自动同步
    			if (pDoc->m_ForceXrange && isMoving!=2)
    				if (tmpFD->minX != m_Xmin || tmpFD->maxX != m_Xmax) {
    					tmpFD->minX = m_Xmin;
    					tmpFD->maxX = m_Xmax;
    					tmpFD->CalcList();
    				}
    		}
    
    		for (auto dot : tmpFD->vetPoint) {
    			if (dot.first < m_Xmin || dot.first > m_Xmax || dot.second < m_Ymin || dot.second > m_Ymax || dot.second != dot.second) {
    				shouldMov = true;
    				continue;
    			}
    			if (shouldMov) {
    				pDC->MoveTo(FPxtoLPx(dot.first), FPytoLPy(dot.second));
    				shouldMov = false;
    			}
    			else
    				pDC->LineTo(FPxtoLPx(dot.first), FPytoLPy(dot.second));
    		}
    
    		pDC->MoveTo(nRight+5, showTop);//显示图例
    		pDC->LineTo(rect.right, showTop);
    		showTop += 5;
    		if (tmpFD->FuncCas == CAS_NORMAL)
    		    pDC->TextOutW(nRight + 5, showTop, _T("f(x)=")+tmpFD->m_Equation);
    		else if (tmpFD->FuncCas == CAS_POLAR)
    			pDC->TextOutW(nRight + 5, showTop, _T("r(t)=") + tmpFD->m_Equation);
    		else if (tmpFD->FuncCas == CAS_TWO) {
    			pDC->TextOutW(nRight + 5, showTop, _T("x(t)=") + tmpFD->m_Equation);
    			showTop += 20;
    			pDC->TextOutW(nRight + 5, showTop, _T("y(t)=") + tmpFD->GetEquation2());
    		} else if (tmpFD->FuncCas == CAS_DATA)
    			pDC->TextOutW(nRight + 5, showTop, _T("y(t)=") + tmpFD->m_Equation);
    		showTop += 25;
    		pDC->SelectObject(pOldPen);
    	}
    }
    

     值得一提的是OnMouseMove的代码,拖动模式下,起点信息已经在OnLButtonDown更新,拖动过程使用了双缓冲绘图防止闪烁。具体原理可参看文末参考资料。

    void CmfcplotView::OnMouseMove(UINT nFlags, CPoint point)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	更新状态栏,此处省略
    	if (isMoving==2) {
    		::SetCursor(LoadCursor(NULL, IDC_SIZEALL));
    		CmfcplotDoc* pDoc = GetDocument();
    		double detx = LPxtoFPx(point.x) - LPxtoFPx(m_posStart.x);
    		pDoc->m_Xmin = tmp_Xmin - detx;
    		pDoc->m_Xmax = tmp_Xmax - detx;
    		double dety = LPytoFPy(point.y) - LPytoFPy(m_posStart.y);
    		pDoc->m_Ymin = tmp_Ymin - dety;
    		pDoc->m_Ymax = tmp_Ymax - dety;
    		CDC* pDC = GetDC();
    		//创建一个内存中的显示设备
    		CDC MemDC;
    		MemDC.CreateCompatibleDC(NULL);
    		//创建一个内存中的图像
    		CBitmap MemBitmap;
    		CRect rect;
    		GetClientRect(&rect);
    		MemBitmap.CreateCompatibleBitmap(pDC, rect.right, rect.bottom);
    		//指定内存显示设备在内存中的图像上画图
    		MemDC.SelectObject(&MemBitmap);
    		//先用一种颜色作为内存显示设备的背景色
    		MemDC.FillSolidRect(rect.left, rect.top, rect.right, rect.bottom, RGB(144, 144, 144));
    		this->OnDraw(&MemDC);
    		//将内存中画好的图像直接拷贝到屏幕指定区域上
    		pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &MemDC, 0, 0, SRCCOPY);
    		//释放相关资源
    		ReleaseDC(pDC);
    	}
    	else if (isMoving == 1) {
    		::SetCursor(LoadCursor(NULL, IDC_HAND));
    	}
    	显示函数最近点部分,此处省略
    	CView::OnMouseMove(nFlags, point);
    }
    
    

    完整代码

    github
    gitee
    csdn下载

    参考资料

    展开全文
  • 这个系列文章讲解高等数学的基础内容,注重学习方法的培养,对初学者不易理解的问题往往会不惜笔墨加以解释。在内容选取上,以国内的经典教材”同济版高等数学“为蓝本,并对具体内容作了适当取舍与拓展。例如用ε-...

    这个系列文章讲解高等数学的基础内容,注重学习方法的培养,对初学者不易理解的问题往往会不惜笔墨加以解释。在内容选取上,以国内的经典教材”同济版高等数学“为蓝本,并对具体内容作了适当取舍与拓展。例如用ε-δ语言证明函数极限,以及教材中多数定理的详细证明过程,这些内容高等数学课程通常不要求掌握,因此在这个系列文章中不作过多介绍。相应地,我们补充了一些类似”利用泰勒公式推导二项式定理”、“零点定理的妙用“等具有一定趣味性的内容,作为对传统教材内容适度拓展。

    本系列文章适合作为大一新生初学高等数学时的课堂同步辅导,也可作为高等数学期末复习以及考研第一轮复习时的参考资料。文章中的例题大多为扎实基础的常规性题目和帮助加深理解的概念辨析题,并适当选取了一些考研数学试题。所选题目难度各异,对于一些难度较大或对理解所学知识有帮助的“经典好题”,我们会详细讲解。

    14687f690e1e1f2da6d71fb0dcf9924d.png

    上一节中我们简单介绍了解析几何中研究曲面的一般方法,显然一条平面曲线绕某条直线旋转一周可以形成一个曲面,称为“旋转曲面”,本节我们来介绍旋转曲面的基本知识,主要包括与旋转曲面相关的一些概念,旋转曲面的方程,以及一些重要的旋转曲面,例如圆锥面、旋转单叶双曲面、旋转双叶双曲面、椭球面等。其中旋转曲面的方程是须要重点掌握的内容,求旋转曲面的方程,以及判断给定旋转曲面是如何形成的,都是这部分内容的重点题型,我们以后会进一步介绍此类问题。(由于公式较多,故正文采用图片形式给出。)

    95a778db8187d889dec914ef2014c412.png

    a00af799af28c0aa4a230b8cb0f41e4c.png

    8f150e62ebfa042ba7ace1aa0119677e.png

    f8a2fcfe61a9c27093cc357a1a1358e9.png

    5aee445cb2aeb74e9aa5d50521b1e3cf.png

    上一篇:高等数学入门——曲面研究的基本问题与方法概述

    (已发布的“高等数学入门”系列文章可以在“历史文章”菜单中查看,或者利用公众号内的搜索功能查找。笔误,双叶双曲面处应改为绕x轴,抱歉!)

    欢迎关注数学若只如初见

    1d49818fdee96072e1645411c4f58f8b.png

    展开全文
  • 数学建模中的常见模型

    千次阅读 2020-08-29 22:38:30
    数学建模中比较常见的几种模型: (一)、预测与预报 1、灰色预测模型(必须掌握) 满足两个条件可用: ①数据样本点个数少,6-15个 ②数据呈现指数或曲线的形式 2、微分方程预测(高大上、备用) 无法直接找到原始...
  • 该文档介绍了圆锥曲线的相关概念及解题思路,在高考与数学竞赛中可以发挥较大作用。
  • 今天为大家带来的是小袁老师为大家总结的圆锥曲线题目的解题技巧,有例题有讲解!善用几何性质圆锥曲线的几何性质可以说是基础中的基础,...最常见的就是如下焦点三角形的面积公式: 小练习:巧用第二定义圆锥曲线的...
  • 1. 引例(如何描述动点的轨迹?) 2. 参数方程的概念 (一元函数y=f(x),方程F(x,y)=0的图形通常为平面曲线) 3. 竖直判断法判断图形是否为函数...4. 曲线的参数方程 ...7. 常见曲线的参数方程 ...
  • 后面我们将介绍几种常见数学建模算法的python实现,旨在展示python在本领域的强大威力。1问题描述你希望通过几种常见算法的实现,了解python在数学建模中的能力。2解决方案python除了丰富的原生数据结构外,拥有强大...
  • 点击上方蓝色字体“高中数学王晖”关注王晖老师,免费获取各种知识干货和学习经验~~~您的点赞转发是对老师的最大鼓舞~~~距高考还有142天圆锥曲线中的定点,定值以及最值问题是近几年高考的一个常考点,今天给大家...
  • 数学建模-常见数据分析代码

    千次阅读 2019-09-09 07:18:27
    一,matlab绘图函数汇总 基本绘图和图形 ... 沿曲线绘制误差条 hold 在图形窗口中保留当前图形 line 创建线条对象 LineSpec (Line Specification)...
  • 圆锥曲线是高考压轴大题,解题的关键往往是第一问能否求出轨迹方程。解答题中以待定系数法为多,一旦变换考法,想必不少学生都会懵。为了更好的解决这一问题,清北助学团针对轨迹方程的常见考法做出了系统总结。(想...
  • 公众号“潘越高中数学”创建于2020年7月10日,创建以来受到广大热爱数学的朋友的关注和支持,也有热心朋友对办好本号提出中肯的意见,我将不断学习,积极改进,与各位朋友共同创建一个更加利于学习与交流的平台!...
  • 转自公众号“机器学习炼丹术”,已获得作者授权文章目录:1 生活中的正态分布2 名字由来3 剖析细节4 有偏分布每个人都相信它(正态分布):实验工作者认为它是一个数学定理,数学研究者认为它是一个经验公式。...
  • mfc绘制数学函数图像

    2020-07-18 22:52:49
    3)绘制数学曲线时应包括坐标轴和刻度以及相应的数字(字符),数学函数公式; 4)可以在一个坐标系中绘制多条数学曲线; 5)可以选择不同颜色来绘制不同的曲线。 6)当鼠标移动到曲线上某点时,可以显示该点的...
  • 经典对数型凹凸性函数模型1今日题目2视频讲解3解题分析4往期视频往期视频题型分类汇总函数三角函数概率与统计导数圆锥曲线排列组合数列立体几何二项式集合平面向量不等式复数直线与圆极坐标参数方程压轴题简易逻辑...
  • 五年级升六年级是个关键阶段,五年级是小学数学知识点的峰值阶段,六年级趋于缓和。五升六阶段,小学数学大部分内容已经...文末王老师汇总小学数学求阴影部分面积题型,都是常见考察题,如果把这些题目理解透彻,对...
  • n 阶贝塞尔曲线计算公式——Ts实现

    千次阅读 2020-03-25 15:33:09
      Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究...
  • 文章目录前言一、基本简介二、一些特点三、一个例子四、公式推导1、一次贝塞尔曲线2、二次贝塞尔曲线3、三次贝塞尔曲线4、四次贝塞尔...贝塞尔曲线是应用于二维图形应用程序的数学曲线。曲线的定义有四个点:起始点、终
  • 更多精彩内容请关注我们 为了让各位能够给自学、预习、复习高中数学课程提供方便,本公众号整理了高考中比较常见、巧妙的题型、方法、技巧供大家学习、参考。 也希望各位能够转发、分享,让更多的学习爱好者收益!▼...
  • 原子理论之后,它变成了对测不准的电子组成的结构的一种描述,这与古人的不同在于物质波(概率波)的“含糊”表达(数学拟合非决定性意义)替代了古人的决定性意义的表达;而量子理论之后,这个“粒”成为最小的可测量的...
  • 数学分析在初等数学中的运用与例题选讲 作者:王见勇 编著 出版时间:2015年版 内容简介 《数学分析在初等数学中的运用与例题选讲》共分极限、导数与微分、积分与级数四...4.2.4 常见中学数学用表的制作原理 参考文献
  • Unity中我们常见一些有弧度的曲线 足球射门之类的我们可以用到贝塞尔曲线 数学原理 线性贝塞尔曲线 线性贝塞尔曲线 看起来类似unity自带的Lerp一样 二次贝塞尔曲线 二次贝塞尔曲线 从绿色线的...
  • 数学实验 常见空间曲线和曲面 常见空间曲线与曲面方程 椭球面 单叶双曲面 双叶双曲面 椭圆抛物面 双曲抛物面 圆柱螺线和圆锥螺线 抛物螺线 轴截面的曲边为一条抛物线的螺线 球面的绘制 球面的绘制 球面的绘制 椭球面...
  • 200个经典C程序源码(包括基础篇+数据结构篇+数值计算与趣味数学篇+图形篇+系统篇+常见试题解答篇) 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006...
  • 直线 在数学上被定义为两段无限延长的线,无法度量长度,是一个抽象的概念 曲线 例如弯曲头发 射线 有一端固定,而另一端无限延长,例如火箭发射,从一个点开始发射,这个概念其实不太准确,火箭是会停下来的,...
  • 实际上这是发电厂用来给水冷却的冷却塔,现在常见的就是双曲线冷却塔,是一种自然通风式冷却塔。双曲线冷却塔双曲线冷却塔双曲线冷却塔什么是双曲线冷却塔因为其外形类似于数学图形内的双曲线图形,因此此类塔通常称...
  • 数据拟合又称曲线拟合,俗称拉曲线,是一种把现有数据透过数学方法来代入一条数式的表示方式。科学和工程问题可以通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 255
精华内容 102
关键字:

常见数学曲线