1 Star 4 Fork 1

cantour123 / 数值分析 .高等代数 .数学分析 代码实现

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

数值分析与高等代数中经典算法编程实现

介绍

在一般的数值分析教程中,我们学了基本的数值分析算法.

  1. 线性方程组的求解,LU分解(高斯消元法)、正定矩阵的Cholesky分解、追赶法求解特殊结构的矩阵.
  2. 非线性方程的求解:牛顿迭代法、不动点迭代、二分法等等其他先进的算法。
  3. 函数逼近中学习的插值算法:拉格朗日插值、埃尔米塔插值、分段插值、三次样条插值。最佳平凡逼近、最小二乘问题。
  4. 数值积分中出现的算法:牛顿-柯斯特公式、复合梯形公式、自适应积分.
  5. 线性方程组的迭代算法:雅可比迭代、超松弛迭代技术,共轭梯度法。
  6. 矩阵特征值的计算:幂法、反幂法、QR方法。
  7. 微分方程初值问题算法: 欧拉法、龙格-库塔方法。

而在高等代数中很多算法没有给出计算机的代码实现:

  1. 方阵行列式的求解。
  2. 方阵的逆矩阵求解。
  3. 线性方程组的求解(包括基础解系的部分)。
  4. 向量组的秩,矩阵的秩。
  5. 向量正交化(施密特正交化)。
  6. 多项式的带余除法。
  7. 多项式最大公因数的求法(欧几里得辗转相除法)。

数值分析

数值分析代码matlab实现:

目前实现以下功能(2023-6-29):

1.函数插值

对于函数插值我设计的思路是:建立一个插值的基类Base_Interp,用来承接所有的上层插值方法。

具有以下的属性:

properties       %属性,x0,y0,多项式,n
        m_x0 = nan;
        m_y0 = nan;
        m_polynomial = nan; %保存多项式信息
        m_coef = nan;        %保存多项式系数
        m_n = nan;           %保存插值多项式的个数
end

实现的方法有

% 初始构造
function obj = Base_Interp(x0,y0)
...
end

% 返回预测值(核心函数)
function y_pre = Interp(obj,x)
...
end

% 数据可视化
function plot(obj,str,x,y_real,N)
...
end%plot
拉格朗日插值:
classdef  Lagrange_Interp < Base_Interp
    
    properties       
        % 所有属性继承自 Base_Interp
    end
    
    methods
        function  obj = Lagrange_Interp(x0,y0)
            
           obj = obj@Base_Interp(x0,y0);
           obj.m_n = length(x0);
            %  核心代码
            syms t;
            z = zeros(obj.m_n,1);
            obj.m_polynomial = poly2sym(z,t);       %定义一个符号多项式 
            for i = 1:obj.m_n
                base =y0( i );
                for j =1:obj.m_n
                     if j ~= i
                         base = base* (t-x0(j))/(x0(i)-x0(j));   
                     end
                end
                obj.m_polynomial = obj.m_polynomial + base;
            end
            obj.m_polynomial = simplify(obj.m_polynomial);
            obj.m_coef = sym2poly(obj.m_polynomial);
        end
        
        % 通过已有多项式得到新的多项式
        function y_pre = Interp(obj,x)
            y_pre = Interp@Base_Interp(obj,x);
        end
        
        function plot(obj,x,y_real,N)
            plot@Base_Interp(obj,'Lagrange ',x,y_real,N);
        end
    end% methods
    
end
埃尔米塔插值:
classdef  Lagrange_Interp < Base_Interp
    
    properties       
        % 所有属性继承自 Base_Interp
    end
    
    methods
        function  obj = Lagrange_Interp(x0,y0)
            
           obj = obj@Base_Interp(x0,y0);
           obj.m_n = length(x0);
            %  核心代码
            syms t;
            z = zeros(obj.m_n,1);
            obj.m_polynomial = poly2sym(z,t);       %定义一个符号多项式 
            for i = 1:obj.m_n
                base =y0( i );
                for j =1:obj.m_n
                     if j ~= i
                         base = base* (t-x0(j))/(x0(i)-x0(j));   
                     end
                end
                obj.m_polynomial = obj.m_polynomial + base;
            end
            obj.m_polynomial = simplify(obj.m_polynomial);
            obj.m_coef = sym2poly(obj.m_polynomial);
        end
        
        % 通过已有多项式得到新的多项式
        function y_pre = Interp(obj,x)
            y_pre = Interp@Base_Interp(obj,x);
        end
        
        function plot(obj,x,y_real,N)
            plot@Base_Interp(obj,'Lagrange ',x,y_real,N);
        end
    end% methods
    
end%% 进行Hermite三次多项式插值
classdef Hermite_Interp < Base_Interp
    properties       %属性,x0,y0,多项式,n
        m_dy0 = nan; %保存导数信息
    end
    
    methods
        function obj = Hermite_Interp(x0,y0,dy0)
            
            obj = obj@Base_Interp(x0,y0);
            obj.m_dy0 = dy0;
            obj.m_n = length(x0) -1;
            n = obj.m_n;
            % 核心代码
            obj.m_polynomial = cell(n,1);
            obj.m_coef = cell(n,1);
            syms t;
            for i = 1:n
                x_ = x0(i:i+1);
                y_ = y0(i:i+1);
                dy_ = dy0(i:i+1);
                l1 = (t-x_(2))/(x_(1)-x_(2));
                l2 = (t-x_(1))/(x_(2)-x_(1));
            % 计算 b1,b2
                b1 = (t-x_(1))*l1^2;
                b2 = (t-x_(2))*l2^2;
            % 计算 a1,a2
                a1 = ( 1-2*(t-x_(1))/(x_(1)-x_(2)) ) *l1*l1;
                a2 = (1-2*(t-x_(2))/(x_(2)-x_(1))) *l2*l2;
                obj.m_polynomial{i} = y_(1)*a1+y_(2)*a2+dy_(1)*b1+dy_(2)*b2;
                obj.m_polynomial{i} = simplify(obj.m_polynomial{i});
                obj.m_coef{i} = sym2poly(obj.m_polynomial{i});       
            end
        end
        
        % 得到预测结果
        function y_pre = Interp(obj,x)
            n = length(x);
            y_pre = zeros(n,1);
            x_min = min(obj.m_x0);
            x_max = max(obj.m_x0);
            for i = 1:n
                % pos 的求法
                if x(i) <x_min || x(i) >x_max
                    error("外插值,跳出函数")
                end
                pos = find(obj.m_x0 > x(i),1);
                % test
                y_pre(i) = polyval(obj.m_coef{pos-1},x(i));
            end
        end
      
        function plot(obj,x,y_real,N)
                plot@Base_Interp(obj,'Hermite',x,y_real,N);
        end%plot
        
    end

end
牛顿插值:
%% 这里建立了牛顿插值法的应用
classdef Newton_Interp < Base_Interp
    properties
    end
    
    methods
        % 可以选择插值多项式的阶数
          function  obj = Newton_Interp(x0,y0,N)
                if(~exist('N','var'))
                    N = length(x0);  % 如果未出现该变量,则对其进行赋值
               end
           obj = obj@Base_Interp(x0,y0);
           obj.m_n = length(x0);
           
            %  核心代码
            before = obj.m_y0';     %转化为列向量
            syms t;
            obj.m_polynomial = 0;
            base = 1;
            for i  = 1:N
                obj.m_polynomial = obj.m_polynomial  + before(1)*base;
                base = base*(t-obj.m_x0(i));
                xx = obj.delay_diff(obj.m_x0,i);
                yy = diff(before);
                next = yy./xx;
                before = next;              % 更新列向量
            end
             obj.m_polynomial = simplify(obj.m_polynomial);
             obj.m_coef = sym2poly(obj.m_polynomial);
             
            end
            
           % 类成员, ~是必须的,否则输入参数太多
            function x =  delay_diff(~,x0,n)
                N = length(x0);
                x  =zeros(N-n,1);
                for i = 1:(N-n)
                    x(i) = x0(i+n) - x0(i);
                end
            end
           
            % 得到插值结果
           function y_pre = Interp(obj,x)
             y_pre = Interp@Base_Interp(obj,x);
           end 
            % 可视化部分
            function plot(obj,x,y_real,N)
                plot@Base_Interp(obj,'Newton ',x,y_real,N);
            end         
    end

end

分段线性插值:
%% 线性插值结果 Linear_Interp
classdef  Linear_Interp < Base_Interp
    properties
        % 所有属性继承自 Base_Interp
    end
    
    methods
        function obj = Linear_Interp(x0,y0)
            obj = obj@Base_Interp(x0,y0);
            % 核心代码
            obj.m_n = 1;     %选用线性插值
            n = length(x0) -1;
            obj.m_coef = cell(n,1);
            obj.m_polynomial = cell(n,1);
            for i = 1:n
                x = obj.m_x0(i:i+1);   %保证顺序正确
                y = obj.m_y0(i:i+1);
                obj.m_coef{i} = [diff(y)./diff(x),y(1)-diff(y)/diff(x)*x(1)];
                obj.m_polynomial{i} = poly2sym(obj.m_coef{i});
            end
            
        end
        
        function y_pre = Interp(obj,x)
            n = length(x);
            y_pre = zeros(n,1);
            x_min = min(obj.m_x0);
            x_max = max(obj.m_x0);
            for i = 1:n
                 if x(i) <x_min || x(i) >x_max
                    error("外插值,跳出函数")
                end
                pos = find(obj.m_x0 > x(i),1);
                % test
                y_pre(i) = polyval(obj.m_coef{pos-1},x(i));
            end
        end

        function plot(obj,x,y_real,N)
            plot@Base_Interp(obj,'Linear ',x,y_real,N);
        end
    end
end
三次样条插值:
%% 这里是三次样条插值,分别对每两个点进行分段插值,保证二阶光滑
classdef Spline_Interp < Base_Interp
    properties
    end
    methods
        function obj = Spline_Interp(x0,y0)
          
          obj = obj@Base_Interp(x0,y0);
                                               % 核心代码,这里采取自然边界来处理
          n = length(x0)-1;          %多项式个数
          obj.m_n = n;
          obj.m_polynomial = cell(n,1);
          obj.m_coef = cell(n,1);
          h = diff(obj.m_x0);       %差分结果
          dy = diff(obj.m_y0);
          y = obj.m_y0;
          Z = zeros(n+1,n+1);    %系数矩阵
          Z(1,1) = 1;
          for i = 2:n
              Z(i,i-1) = h(i-1);
              Z(i,i) = 2*(h(i-1)+h(i));
              Z(i,i+1) = h(i);
          end
          Z(n+1,n+1) = 1;
          
          X = obj.m_x0;
          Y = zeros(n+1,1);             %目标值
          
          for i = 2:n
              Y(i) =6*( dy(i)/h(i) - dy(i-1)/h(i-1) );
          end
          m = Z\Y;                     %M为二阶导数值,可以优化
          syms t;
          for i = 1:n
              b = dy(i)/h(i)-h(i)/2*m(i)-h(i)/6*(m(i+1)-m(i));
              c  = m(i)/2;
              d = (m(i+1)-m(i))/(6*h(i));
              obj.m_polynomial{i} = y(i) + b*(t-X(i))+c*(t-X(i))^2 + d*(t-X(i))^3;
              obj.m_coef{i} = sym2poly(obj.m_polynomial{i});
          end
        end
        
        % 得到预测结果
        function y_pre = Interp(obj,x)
            n = length(x);
            y_pre = zeros(n,1);
            x_min = min(obj.m_x0);
            x_max = max(obj.m_x0);
            for i = 1:n
                % pos 的求法
                if x(i) <x_min || x(i) >x_max
                    error("外插值,跳出函数")
                end
                pos = find(obj.m_x0 > x(i),1);
                % test
                y_pre(i) = polyval(obj.m_coef{pos-1},x(i));
            end
        end%Interp
      
        function plot(obj,x,y_real,N)
                plot@Base_Interp(obj,'SplineInterp',x,y_real,N);
        end%plot
        
    end

end

设计原理图:

"拉格朗日插值类的设计思路"

类的抽象结果:

"设计原理"

调用方法:

Interp_main.m是调用插值函数的脚本.

2.非线性方程求解

二分法求解

二分法求解线性方程组是非常直观与稳定的算法,其思想类似于连续函数的零点存在性定理的构造证明。但是缺点是算法收敛速度慢。调用函数为Dichotomic .m

"二分法求解"

不动点迭代求解:

对于任意一个非线性的函数$y = f(x)$,在求解它的零点时,我们有

$f(x) = 0$

我们也可以将其写作

$x= \phi(x)$,

自然的,该函数的零点 $x^*$ 满足

$$x^{} = \phi(x^{}) \tag{A}$$

并且此时我们称$x^*$为函数$f(x)$ 的不动点.

通过计算不动点求解函数零点的方法我们称作不动点迭代,具体的迭代方法是

1.给定初值 $x_0$

2.通过 $x_{n+1} = \phi(x_n),n = 1,2,3,$ ,进行迭代.

随着迭代次数的增加,最终数列${x_n}$会逐步收敛到 $x^*$ .

函数图像:

"迭代法求解方程的函数图像"

$x_{n}$取值路径:

"不动点迭代法取值路径"

该脚本调用函数为:Fix_pointed_iteration.m

牛顿迭代法

设$r$ 是$f(x) = 0$的根,选取$x_0$作为$r$的初始近似值,则我们可以过点$(x_0,f(x_0))$做曲线$y = f(x)$的切线$L$,我们知道切线与x轴有交点,我们已知切线L的方程为

$$L: y = f(x_0) + f'(x_0)(x-x_0)$$

我们求的它与x轴的交点为$x_1 = x_0 - \frac{f(x_)}{f'(x_0)}$

我们在以$(x_1,f(x_1))$斜率为$f'(x_1)$做斜线,求出与x轴的交点,重复以上过程直到$f(x_n)$无限接近于0即可。其中第n次的迭代公式为:

$$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} \tag{B}$$

"牛顿迭代法点列收敛路径"

"牛顿迭代法求解路径的误差值"

牛顿迭代法求解速度非常快,缺点是求解需要知道其导函数的信息,而且计算量更大。

调用脚本是Newton_iteration.m.

割线法

对牛顿迭代法的改进,很多时候,牛顿迭代需要知道函数导数的信息,要么函数不可导,要么导函数非常复杂。

这里采用割线近似代替切线。

其迭代公式为:$$x_{n+1} = x_n - \frac{f(x_n) - f(x_{n-1})}{x_n - x_{n-1}} \tag{C}$$

"割线法迭代点列路径"

割线法调用脚本Secand method .m

以上3种求根方法的综合比较:

调用脚本Test.m

名称 迭代次数 x值 误差
二分法 36 0.257530 <1e-11
不动点法 18 0.2575303 -0.7e-11
牛顿迭代法 3 0.257530 <1e-11

3. 线性方程组求解

线性方程组的求解是数值分析中经久不衰的热门课题

​ —— 喻文健《数值分析与算法》

高斯消元法

消元法是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其代入到另一方程中,这就消去了一未知数,得到一解;或将方程组中的一方程倍乘某个常数加到另外一方程中去,也可达到消去一未知数的目的。消元法主要用于n元一次方程组的求解。

核心

  1. 两方程互换,解不变,第一类初等行变换;
  2. 一方程乘以非零数k,解不变,第二类初等行变换;
  3. 一方程乘以数k加上另一方程,解不变,第三类初等行变换;

[以上摘自百度百科,更加详细的理论参见 谢启鸿的《高等代数》]

高等代数的理论告诉我们:矩阵(增广矩阵)的初等行变换不改变线性方程组的解空间。但是矩阵的初等列变换会改变线性方阵的解空间(如果仅仅交换两列,则未知数对应的结果发生改变,本质上不改变矩阵的解空间)。

调用函数的脚本为Gauss_linear_eqution.m

LU分解

定理1:

设$A \in M_n(R)$  , 则存在唯一的单位下三角矩阵 $L$ 和非奇异上三角矩阵 $U$ , 使得 $A = LU$的充要条件是 $A$的所有顺序主子矩阵都非奇异。

如果有一个矩阵A满秩,但是某一个顺序主子式为0,则可以通过调换矩阵的行和列来保证矩阵$A'$的顺序主子式不全为0。此时有如下分解

$$PA = LU \tag{D}$$

其中P为非奇异矩阵(用于调换矩阵的行)。

而我们最终目的是为了求解线性方程组$Ax = b$。

则采用先求解$Ly = b , Ux = y $的方式进行逐步计算$x$。

并且在使用矩阵$LU$分解的过程中,我们知道其等价于对矩阵采取高斯消元法。因此在编程上,这两种算法的运行效率一致。

函数调用脚本为Lu.m.

Cholesky分解

Cholesky分解(对于正定矩阵)$A = L'L$,L为下三角矩阵。

我们需要知道Cholesky分解是一种特殊的LU分解,因此正定矩阵的所有顺序主子式都大于0,且为对称矩阵,因此可以保证$L,U$是互为转置的。

另外由于矩阵对称,因此矩阵具特殊的结构,从而可以保证矩阵的“信息”更加集中。从而在实际矩阵计算中,分解效率提高一倍。

函数调用脚本为Cholesky.m

线性方程组的迭代法

高等代数部分

高等代数代码matlab实现:

目前实现以下功能(2023-6-29):

  1. 矩阵行列式求解,包括两个函数文件 Det.m,Det2.m。前者是通过行列式展开计算,后者是通过消元法求解.这两个函数的测试文件为matrix_deternimant.m,包括对这两个函数的测试以及与自带函数det计算速度的对比.
  2. 方阵求逆,包括两个函数文件, Inv.m,Inv2.m。前者是先求解矩阵的伴随,后者是通过初等行变换实现.这两个函数的测试文件为 matrix_inverse.m,包括对这两个函数的测试以及与自带函数inv计算速度的对比.
  3. 求矩阵以及向量组的秩.包括一个函数文件 Calc_rank.m 主要实现方法是矩阵的初等变换(目前仅仅实现了初等行变换),测试文件为 matrix_rank.m.
木兰宽松许可证, 第2版 木兰宽松许可证, 第2版 2020年1月 http://license.coscl.org.cn/MulanPSL2 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 6. 语言 “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 条款结束 如何将木兰宽松许可证,第2版,应用到您的软件 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. Mulan Permissive Software License,Version 2 Mulan Permissive Software License,Version 2 (Mulan PSL v2) January 2020 http://license.coscl.org.cn/MulanPSL2 Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: 0. Definition Software means the program and related documents which are licensed under this License and comprise all Contribution(s). Contribution means the copyrightable work licensed by a particular Contributor under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 6. Language THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. END OF THE TERMS AND CONDITIONS How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details.

简介

主要用matlab与R 实现数值分析、高等代数、数学分析中的问题 展开 收起
MulanPSL-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Matlab
1
https://gitee.com/cantour123/AdvancedAlgebra.git
git@gitee.com:cantour123/AdvancedAlgebra.git
cantour123
AdvancedAlgebra
数值分析 .高等代数 .数学分析 代码实现
master

搜索帮助