为什么f'(x)与f(x)/x的交点恰为后者的极值点?

本文通过数学论证和直观解释,揭示了一个有趣的现象:连续函数f(x)的导数f'(x)与f(x)/x相交之处正是f(x)/x取到极值的地方。进而推广到经济学中,边际成本曲线与平均成本曲线相交于后者的最低点。
部署运行你感兴趣的模型镜像

    在今天晚上的微观经济学课上,我又听到了一个比较有意思的东西。试着找找各种类型的连续函数f(x),画出f'(x)和f(x)/x的函数图像,你会发现一个奇怪的现象:f'(x)与f(x)/x相交的地方都是f(x)/x取到极值的地方。简单地算一算,我们不难证实这个结论。f(x)/x的导数等于f'(x)/x - f(x)/x^2。将f'(x)=f(x)/x代入上式,可得f'(x)/x - f(x)/x^2 = f(x)/x^2 - f(x)/x^2 = 0。这就是说,当f'(x)与f(x)/x相等的时候,f(x)/x的导数一定等于0。有意思的是,这个结论还有一个非常直观的解释,你能想到吗?

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

    把f(x)看作一个时间-位置函数,那么f(x)/x就表示前x个单位的时间内物体的平均速度,而f'(x)则表示物体在x时刻的瞬时速度。考虑这两个函数的交点,不妨假设在交点左边有f'(x) < f(x)/x,那么在交点右边就一定有f'(x) > f(x)/x。显然,如果当前的速度比平均速度要小,那么平均速度会被拖慢,也即f(x)/x是递减的;反过来,当前的瞬时速度大于平均速度时会向上拉动平均速度,f(x)/x将会变得递增。这就告诉我们,两条曲线的交点处于f(x)/x的极小点。
    注意,不管是前面的数学论证还是这里的直观解释,我们都忽略了很多特殊的情况没有讨论,仅仅说明了一些主要思想。不过,这已经足以推出一个重要的经济学结论:边际成本曲线与平均成本曲线相交于后者的最低点。

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

// 123.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #if def__APPLE__ #include<GLUT/glut.h> #else #include<GL/glut.h> #endif #include<cmath> #include<vector> #include<iostream> #include<set> using namespace std; set <pair<int,int>>edgeMarks; void resize(GLsizei w,GLsizei h){ if(h==0){ h=1; } glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h){ glOrtho(0.0f,200.0f,0.0f,200.f*h/w,1.0f,-1.0f); }else{ glOrtho(0.0f,200.0f*w/h,0.0f,200.0f,1.0f,-1.0f); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void drawPixel(int x,int y){ glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); } //check判断(x1,y1)是否是三点之中的极值点 bool check(int x0,int y0,int x1,int y1,int x2,int y2){ //x1是否在中间? if(x1>=x0&&x1>=x2){ return false; } if(x1<=x0&&x1<=x2){ return false; } if(y0>y1&&y2>y1){ return true; } if(y0<y1&&y2<y1){ return true; } return false; } //BresenhamLine void BresenhamLine(vector <int>p0,vector <int>p1){ int x0=p0[0],y0=p0[1], x1=p1[0],y1=p1[1]; //两种特殊情况:x0==x1||y0==y1 if(x0==x1){ if(y0>y1){ swap(y0,y1); } for(int i=y0;i<=y1;i++){ drawPixel(x0,i); } return; } else if(y0==y1){ drawPixel(x0,y0); drawPixel(x1,y1); edgeMarks.insert(make_pair(x0,y0)); edgeMarks.insert(make_pair(x1,y1)); return; } int kRev=(y1-y0)/(x1-x0); bool isKGT1=false;//1:Kisgreaterthan1 bool isKNeg=(y1-y0)*(x1-x0)>=0?false:true;//1:Kisnegative if(abs(kRev)>=1){//|k|>1 swap(x0,y0); swap(x1,y1); isKGT1=true; } if(isKGT1){ if(isKNeg){ if(y0<y1){ swap(y0,y1); swap(x0,x1); } }else{ if(y0>y1){ swap(y0,y1); swap(x0,x1); } } }else{ if(x0>x1){ swap(y0,y1); swap(x0,x1); } } int x=x0,y=y0; int dx=x1-x0,dy=y1-y0; if(isKNeg){ dy=-dy; } int e=-dx; while(x<=x1){ if(isKGT1){ drawPixel(y,x); edgeMarks.insert(make_pair(y,x)); }else{ drawPixel(x,y); edgeMarks.insert(make_pair(x,y)); } x++; e+=2*dy; if(e>0){ if(isKNeg){ y--; }else{ y++; } e-=2*dx; } } } void edgeMarkFilling(vector<vector<int>>points){ //gety_min&y_max int y_min=points[0][1],y_max=points[0][1]; int x_min=points[0][0],x_max=points[0][0]; //drawlines for(unsigned int i=1;i<points.size();i++){ BresenhamLine(points[i-1],points[i]); y_min=min(points[i][1],y_min); y_max=max(points[i][1],y_max); x_min=min(points[i][0],x_min); x_max=max(points[i][0],x_max); //局部最低点——0个重叠的交点,局部最高点——0个 if(i<points.size()-1){ if(check(points[i-1][0],points[i-1][1],points[i][0],points[i][1],points[i+1][0],points[i+1][1])){ edgeMarks.erase(make_pair(points[i][0],points[i][1])); } } } BresenhamLine(points[0],points[points.size()-1]); int lastpoint=points.size()-1; if(check(points[lastpoint-1][0],points[lastpoint-1][1],points[lastpoint][0],points[lastpoint][1],points[0][0],points[0][1])){ edgeMarks.erase(make_pair(points[lastpoint][0],points[lastpoint][1])); } if(check(points[lastpoint][0],points[lastpoint][1],points[0][0],points[0][1],points[1][0],points[1][1])){ edgeMarks.erase(make_pair(points[0][0],points[0][1])); } //filling glColor3f(0.0,0.0,1.0); glBegin(GL_POINTS); for(int i=y_max;i>=y_min;i--){ bool isInside=false; for(int j=x_min;j<x_max;j++){ if(edgeMarks.count(make_pair(j,i))==1){ isInside=!isInside; } if(isInside){ glVertex2i(j,i); //cout<<j<<''<<i<<endl; } } } glEnd(); } void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3d(1,0,0); vector<vector<int>>points(3); vector<int>p0(2),p1(2),p2(2),p3(2),p4(2),p5(2),p6(2); p0[0]=40,p0[1]=40; p1[0]=10,p1[1]=10; p2[0]=70,p2[1]=10; points[0]=p0; points[1]=p1; points[2]=p2; edgeMarkFilling(points); glutSwapBuffers(); } int main(int argc,char*argv[]){ glutInit(&argc,argv); glutInitWindowSize(400,400); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE); glutCreateWindow("EdgeMarkFilling"); glutReshapeFunc(resize); glutDisplayFunc(display); //setRC glClearColor(1,1,1,1); glutMainLoop(); return 0; } 这段代码呢,总结一下遇到的问题和感想
11-16
MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值