求导

表达式解析和表达式求导面向对象

百般思念 提交于 2020-03-04 18:32:28
表达式解析和表达式求导 Differential Homework 形式化描述 对表达式做求导 设定的形式化表述 表达式 → \rightarrow → 空白项 [加减 空白项] 项 空白项 | 表达式 加减 空白项 项 空白项 项 → \rightarrow → [加减 空白项] 因子 | 项 空白项 * 空白项 因子 因子 → \rightarrow → 变量因子 | 常数因子 变量因子 → \rightarrow → 幂函数 | 三角函数 常数因子 → \rightarrow → 带符号的整数 幂函数 → \rightarrow → x [空白项 指数] 三角函数 → \rightarrow → sin 空白项 ‘(’ 空白项 x 空白项 ‘)’ [空白项 指数] | cos 空白项 ‘(’ 空白项 x 空白项 ‘)’ [空白项 指数] 指数 → \rightarrow → ** 空白项 带符号的整数 带符号的整数 → \rightarrow → [加减] 允许前导零的整数 允许前导零的整数 → \rightarrow → (0|1|2|…|9){0|1|2|…|9} 空白字符 → \rightarrow → (空格) | \t 空白项 → \rightarrow → {空白字符} 加减 → \rightarrow → + | - 其中{}表示0个、1个或多个,[

PAT B1010 一元多项式求导 (25分)

南笙酒味 提交于 2020-02-27 13:08:33
题目链接 : https://pintia.cn/problem-sets/994805260223102976/problems/994805313708867584 题目描述 设计函数求一元多项式的导数。(注:x^​ n ​​ ( n为整数)的一阶导数为nx^(​n−1)​​ 。) 输入 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。 样例输入 3 4 -5 2 6 1 -2 0 样例输出 12 3 -10 1 6 0 代码 # include <cstdio> struct { int x , y ; } a [ 1001 ] ; int main ( ) { int t = 0 , flag = 0 ; while ( scanf ( "%d %d" , & a [ t ] . x , & a [ t ] . y ) != EOF ) t ++ ; for ( int i = 0 ; i < t ; i ++ ) { if ( a [ i ] . y != 0 ) { if ( i ) printf ( " " ) ; //在前面加空格 printf ( "%d %d

1010 一元多项式求导

限于喜欢 提交于 2020-02-24 13:55:05
一元多项式求导 设计函数求一元多项式的导数。(注:x^​n(n为整数)的一阶导数为nx ^ ​n−1​​ 。) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。 输入样例: 3 4 - 5 2 6 1 - 2 0 输出样例: 12 3 - 10 1 6 0 # include <stdio.h> int main ( ) { int a [ 1001 ] , b [ 1001 ] , i , j , n ; for ( i = 0 ; i < 1001 ; i ++ ) { scanf ( "%d %d" , & a [ i ] , & b [ i ] ) ; if ( b [ i ] == 0 ) break ; } n = i ; for ( j = 0 ; j <= n ; j ++ ) { if ( b [ j ] == 0 ) { printf ( "0 0\n" ) ; } else { printf ( "%d %d" , a [ j ] * b [ j ] , b [ j ] - 1 ) ; if ( j == n - 1 ) { break

向量与矩阵求导与实例分析

妖精的绣舞 提交于 2020-02-15 02:12:25
【说明】 1. 相关内容经过诸多学习内容整理 2. 比较权威的学习源可参考维基百科 https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities 3. 机器学习关联内容学习: 1)西瓜书第55页多元线性回归涉及到的公式推导 2)机器学习实战 第138页 目录 一,布局的概念 分子布局 分母布局 二、一个求导的例子(线性回归中正规方程) 三、另一个例子的推导 四、矩阵及向量求导法则 五、求导公式速查表 一,布局的概念 重要前提: 若 x 为向量,则默认 x 为列向量, 为行向量 布局简单地理解就是分子 y、分母 x 是行向量还是列向量。 分子布局(Numerator-layout): 分子为 y 或者分母为 (即,分子为列向量或者分母为行向量) 分母布局(Denominator-layout): 分子为 或者分母为 x (即,分子为行向量或者分母为列向量) 为了更加深刻地理解两种布局的特点和区别,下面是从维基百科中布局部分拿来的例子: 分子布局 标量/向量: (分母的向量为行向量) 向量/标量: (分子的向量为列向量) 向量/向量: (分子为列向量横向平铺,分母为行向量纵向平铺) 标量/矩阵: ( 注意这个矩阵部分是转置的,而下面的分母布局是非转置的 ) 矩阵/标量: 分母布局 标量/向量:

高等数学——复杂函数的求导方法

瘦欲@ 提交于 2020-02-14 08:57:08
本文始发于个人公众号: TechFlow,原创不易,求个关注 上一篇文章我们复习了函数求导的定义和一些常见函数的导数,今天这篇文章我们回顾一下复杂函数的求导方法。先强调一下,今天的文章很重要,想要看懂机器学习各种公式推导,想要能够自己推一推各种公式,函数求导是基础中的基础,在算法这个领域,它比积分要重要得多。 我们先来看第一种情况:多个函数进行四则运算的导数。 函数四则运算求导法则 我们假设 \(u=u(x)\) 和 \(v=v(x)\) 都在x点有导数,那么它们进行加减乘除四则运算之后的结果的导数有如下性质: \[ \begin{aligned} \left[u(x) \pm v(x)\right]'&= u'(x) \pm v'(x) \\ \left[u(x)v(x)\right]' &= u'(x)v(x) + u(x)v'(x) \\ \left[\frac{u(x)}{v(x)}\right] &= \frac{u'(x)v(x)-u(x)v'(x)}{v^2(x)} (v(x) \neq 0) \end{aligned} \] 我们来看一下证明过程,熟悉证明过程并不是炫技,除了能加深对公式的理解之外,更重要的是防止遗忘。即使以后真的不记得公式的细节了,也可以临时推导一下,这是学算法和数学很重要的技巧。 我们先来看第一个,第一个很容易证明,我们直接套一下导数的公式即可:

矩阵求导(包含极大似然估计)

房东的猫 提交于 2020-02-11 22:40:50
from https://zhuanlan.zhihu.com/p/24709748 极大似然 https://blog.csdn.net/zengxiantao1994/article/details/72787849 https://zhuanlan.zhihu.com/p/26614750 矩阵求导 注1: 注2: 例子2 极大似然估计 知识: https://blog.csdn.net/zengxiantao1994/article/details/72787849 https://zhuanlan.zhihu.com/p/26614750 贝叶斯公式 随机变量θ表示模型的参数 如果 是已知确定的, 是变量,这个函数叫做概率函数(probability function),它描述对于不同的样本点 ,其出现概率是多少。 如果 是已知确定的, 是变量,这个函数叫做似然函数(likelihood function), 它描述对于不同的模型参数,出现 这个样本点的概率是多少。 未完.... 来源: https://www.cnblogs.com/shish/p/12296538.html

PAT乙级 1010 一元多项式求导 (25分) (C语言 + 详细注释)

孤街浪徒 提交于 2020-02-07 12:29:21
输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0 。 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 //本题只需要掌握导数的一些基本知识( (x^y)' = y * x ^ (y-1) ),再注意一些细节即可AC了 //下面是本蒻蒻的代码: #include<stdio.h> int main(){ int x, y, flag; //flag是用来判断是否是第一项,即是否需要输出前导空格(因为题目要求最后一个数字后面没有空格) flag = 0; while(~scanf("%d%d", &x, &y)){ //注意特判输出的结束,因为scanf未读入数据是返回-1,而~(-1) == 0,所以只要是正常读入该式子就不为0,即循环继续 if(y == 0) //指数y等于0说明已经到了常数项,循环即可停止了 break; printf("%s%d %d", flag ? " " : "" , x * y, y - 1); //因为读入的是非零项,所以系数x不为0,根据幂函数求导法则知求导后系数为原系数 * 指数,指数

1010 一元多项式求导 (25分)

好久不见. 提交于 2020-02-02 14:07:06
Github代码(不全,更新中) 分析:求导过程不再赘述。要注意的是,如果全部都是零多项式,最后要输出"0 0" #include <iostream> #include <cstdio> using namespace std; typedef struct Part{ int _ratio; int _index; void derivation(){ _ratio = _ratio * _index; _index -= 1; } }Part; int main() { Part parts[128]; int i=0; while(cin>>parts[i]._ratio>>parts[i]._index){ char ch = getchar(); parts[i++].derivation();//求导,更新系数和指数 if(ch == '\n') break; } int time=0; for(int j=0; j<i; j++){ if(parts[j]._ratio!=0){//如果系数为零,则为零多项式,不予输出 cout<<(time!=0?" ":"")<<parts[j]._ratio<<" "<<parts[j]._index; time++; } } if(!time){//如果全部是零多项式,输出"0 0" cout<<"0 0\n"; }

1010 一元多项式求导

☆樱花仙子☆ 提交于 2020-02-02 00:52:48
1010 一元多项式求导 (25分) 设计函数求一元多项式的导数。(注: x n x^n x n ( n n n 为整数)的一阶导数为 n x n − 1 nx^{n-1} n x n − 1 。) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 C语言 代码: #include < stdio . h > int main ( ) { int a , b , i = 0 ; while ( scanf ( "%d %d" , & a , & b ) != EOF ) { if ( a != 0 && b != 0 ) { if ( i == 0 ) { printf ( "%d" , a * b ) ; } else { printf ( " %d" , a * b ) ; } printf ( " %d" , b - 1 ) ; i ++ ; } } if ( i == 0 ) printf ( "0 0" ) ; return 0 ; } 来源: CSDN 作者:

1010 一元多项式求导 (25分)java

点点圈 提交于 2020-02-01 03:03:22
设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nx​n−1​​。) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0 。 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 import java.util.Scanner; /* * 输出导数多项式非零项的系数和指数 * 即b==0的不用输出 * */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int flag = 0; while(sc.hasNext()) { int a = sc.nextInt(); int b = sc.nextInt(); if(b!=0) { if(flag==0) { flag=1;//第一次不输出空格 }else { System.out.print(" ");//以后后面还有ab的话就输出空格 } a*=b; b--; System.out.print(a+" "