[从头学数学] 第228节 函数与极限

Posted mwsister

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[从头学数学] 第228节 函数与极限相关的知识,希望对你有一定的参考价值。

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了元婴期的修炼。
这次要修炼的是数学分析(或称高等数学、或称微积分)。

正剧开始:

星历2016年05月28日 17:08:16, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[函数与极限]。




















<span style="font-size:18px;">###
# @usage   集合、函数映射
# @author  mw
# @date    2016年05月28日  星期六  13:14:05 
# @param
# @return
#
###


#集合、函数映射
class FunctionMap():
    def __init__(self):
        self._Expr = alg.AlgExpressionCalc();

    #把一个数组封装成一个字符串, 如=>[(3)*x^[1],(3)*y^[1],(1)*x^[2]]
    #由于使用目的单一,这个数组代表的是多项式
    #所以,必然只是一维的数组 
    def zipArray2String(self, array):
        s = '[';
        for i in range(len(array)):
            s+='\\''+array[i]+'\\',';
        #去除最后的加号
        s = s[:-1];
        s += ']';
        return s;

    
    #把一个表示数组的字符串拆分成数组
    #注意:这个字符串必然是由格式化后的数组封装成的
    #不要把任意字符串拿来处理,会出错的
    def zipString2Array(self, s):
        s = s.replace('\\'', '');
        #去除最外面的[]对
        s = s[1:-1];
        array = [];
        #记录加号的位置,这个加号必然后面紧跟一个(号,这是格式
        signIndex = s.find(',');
        if signIndex == -1: #原数组只有一个单项式
            pass;
        else:
            while (signIndex != -1):
                array.append(s[:signIndex]);
                s = s[signIndex+1:];
                signIndex = s.find(',');
            
        array.append(s);

        return array;

    #把一个字符串中的所有空格去除
    def removeSpaceInString(self, str1):
        return str1.replace(' ', '');
    
    #把一个字符串中的所有小括号的位置按层次返回一个标示数组
    #如'((0))(0)' = [-1, -2, 0, 2,1, -1, 0, 1];
    def bracketLevelIndexArray(self, str1):
        len_ = len(str1);
        array = [0]*len_;

        #初始化左、右括号为0级,遇左括号-1,遇右括号+1
        lLevel = rLevel = 0;

        for i in range(len_):
            if (str1[i] == '('):
                lLevel-=1;
                array[i] = lLevel;
            elif (str1[i] == ')'):
                rLevel = -lLevel;
                array[i] = rLevel;
                lLevel+=1;

        #左右括号匹配检查
        if abs(min(array)) != abs(max(array)):
            print('左右括号不匹配!');
            #括号不匹配,默认没有括号,这里可以作为函数式是否需要求解的一个判定
            #因为如果没有括号,可以认为没有函数映射
            return [0]*len_;

        return array;
            

    #输入函数和自表量[[名称,值代数式]...]的映射表,返回值代数式(可解)
    #或原样输出函数和自表量[[名称,值代数式]...]的映射表(不可解时)
    def functionMapCalc(self, fun, variableMap):
        #去掉多余的空格,这是格式化的一部分
        fun = self.removeSpaceInString(fun);
        #判断是否可计算
        if (not self.judgeEvalable(fun)):
            return [fun, variableMap];
        
        bracketArray = self.bracketLevelIndexArray(fun);
        maxBracketLevel = max(bracketArray);

        #没有括号,表示没有函数映射的存在,直接返回输入值
        if (maxBracketLevel <= 0):
            return [fun, variableMap];

        #到这里就确定函数可以计算了
        #每次取最里面的括号部分进行计算


        #把函数中的每个右括号都多加一层,这样是给'self._Expr.strPolyCombine('调用对上        
        funChanged = fun.replace(')', '))');

        for i in range(len(variableMap)):
            #映射表中的参数名称
            var = variableMap[i][0];
            #前后加限定防止过度匹配
            sL = '('+var+',';
            sR = ','+var+')';

            varValue = self.zipArray2String(variableMap[i][1]);
            funChanged = funChanged.replace(sL, '('+varValue+',');
            funChanged = funChanged.replace(sR, ','+varValue+')');

        #每一步操作后都后并一下同类项
        sFun = 'self._Expr.strPolyCombine(';

        #幂, 乘, 加, 减, 负
        sPow = 'self._Expr.strpow_n';
        sMul = 'self._Expr.strdot';
        sAdd = 'self._Expr.stradd';
        sSub = 'self._Expr.strsub';
        sMinus = 'self._Expr.strminus';
        
        
        funChanged = funChanged.replace('[POW]', sFun+sPow);
        funChanged = funChanged.replace('[MUL]', sFun+sMul);
        funChanged = funChanged.replace('[ADD]', sFun+sAdd);
        funChanged = funChanged.replace('[SUB]', sFun+sSub);
        funChanged = funChanged.replace('[MINUS]', sFun+sMinus);

        return [eval(funChanged), variableMap];        


    #判断关于多项式的函数式可否计算得出多项式解
    #只要含有下面所列函数,则认为不可以得出多项式解
    #这时的处理就会将原函数依样返回
    def judgeEvalable(self, fun):
        if (fun.find('[DIV]') != -1 or
            fun.find('[LOG]') != -1 or
            fun.find('[LN]') != -1 or
            fun.find('[EXP]') != -1 or
            fun.find('[SIN]') != -1 or
            fun.find('[COS]') != -1 or
            fun.find('[TAN]') != -1 or
            fun.find('[ASIN]') != -1 or
            fun.find('[ACOS]') != -1 or
            fun.find('[ATAN]') != -1):
            return False;

        return True;

def tmp():
    #代数式
    Expr = alg.AlgExpressionCalc();
    #函数映射
    Map = FunctionMap();

    #多项式拆装实验
    a = Expr.strPolyCombine(Expr.strPolyFormat(['x', 'y', '2x', '2y', 'x^[2]']));    
    print(a);

    s = Map.zipArray2String(a);
    print(s);

    a = Map.zipString2Array(s);
    print(a);

    b = Expr.strPolyFormat(['x']);
    c = Expr.strPolyFormat(['2']);
    print(b);
    print(c);
    #函数映射的格式化写法:[函数名](自变量多项式)
    fun = Map.removeSpaceInString('[MUL]([MUL]([POW](a, 2), b), c)');

    calc = Map.functionMapCalc(fun, [['a', a], ['b', b], ['c', c]]);
    print(calc);</span>







































































































































本节到此结束,欲知后事如何,请看下回分解。


以上是关于[从头学数学] 第228节 函数与极限的主要内容,如果未能解决你的问题,请参考以下文章

[从头学数学] 第159节 反比例函数 小结与复习题

[从头学数学] 第158节 反比例函数

[从头学数学] 第162节 锐角三角函数

[从头学数学] 第236节 多元函数微分法及其应用

[从头学数学] 第172节 直线与方程

[从头学数学] 第238节 曲线积分与曲面积分