给大家出一个C#面试题,关于委托的
题目,求一个函数在某一点的导数。要求用 C# 语法实现,函数和自变量都是不确定的。
提示,用到委托和一点点高等数学的知识。对于不清楚委托有什么用的人,也可以尝试不用委托实现。 --------------------编程问答-------------------- 这里是参考答案,在100楼以后公布。 --------------------编程问答-------------------- 精度要求如何呢? --------------------编程问答--------------------
任意。但是不可导的情况要能检测出来。 --------------------编程问答-------------------- 什么是导数?望得一干二静。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 卡,微积分的公式都忘完了, --------------------编程问答-------------------- 说清输入格式和输出格式啊 --------------------编程问答-------------------- 为什么只要是面试题,就会被论坛设置为推荐帖呢? --------------------编程问答-------------------- 导数微分啥的忘光光了
--------------------编程问答-------------------- 顶,求真相 --------------------编程问答-------------------- 你让没上大学的我情何以堪。 --------------------编程问答-------------------- 我只会写这个
static double GetDerivative(Func<double> func, double position) {
// 迭代法是最好的,求导数也可以迭代吗?
}
--------------------编程问答-------------------- 导数公式里面是不是一推的圈圈叉叉的符号。 --------------------编程问答-------------------- 知道导弹,导数是啥 --------------------编程问答-------------------- 是不是加减0.0000....0000001
然后算左导数右导数
两边值&一阶导数差太多就不可导?
所谓委托就是搞个函数指针指向那个要被求导的函数? --------------------编程问答--------------------
同道中人
--------------------编程问答-------------------- 委托实质上是函数指针,用委托的意思,就是将向求导函数传入两个参数,一个是待求导函数的指针,即在C#中声明为委托类型的函数,另一个值是求导位置,但是函数的自变量是什么类型呢? --------------------编程问答-------------------- 公式很简单
limit f'(x0)=(f(x0+dx)-f(x0))/dx
dx->0
问题时dx趋向0的时候不可靠了吧
f(x0+dx)与f(x0)几乎相同,受精度限制这个结果已经相当不可靠了啊
--------------------编程问答-------------------- 什么是导数啊? --------------------编程问答-------------------- 高中学了那么一丁点,没用过,全忘了 --------------------编程问答-------------------- 先顶后看~~~~~~~~~~~ --------------------编程问答-------------------- --! 这个LZ是在考数学么?
公式全还老师了 早不记得了、、、、 --------------------编程问答-------------------- 导数是什么?忘光了…… --------------------编程问答--------------------
2的倒数就是1/2 --------------------编程问答-------------------- 委托就像CPP里面函数的指针 --------------------编程问答-------------------- 速度顶贴,坐等答案 --------------------编程问答-------------------- 有可能不可导,函数是否应该是
Func<double?> func
有可能函数在某些点上某有值呢(不连续)
还有,假如函数f(x)为正负根号x呢(x>=0) 也不可导吧 --------------------编程问答-------------------- 顶楼主,来学习 --------------------编程问答-------------------- 抛砖引玉
static double GetDerivative(Func<double, double> func, double position) {
double dx = 0.0001;
while(true) {
if(func(position + dx) - func(position) < 0.0001) break;
dx /= 10;
}
return (func(position + dx) - func(position)) / dx;
}
static void Main(string[] args) {
Console.WriteLine(GetDerivative(x => Math.Cos(x), 0));
Console.WriteLine(GetDerivative(x => Math.Cos(x), Math.PI));
Console.WriteLine(GetDerivative(x => Math.Cos(x), Math.PI/2));
Console.WriteLine(GetDerivative(x => Math.Cos(x), 1));
}
这个精度是在太低,这种精度下就不要搞什么不可导了 --------------------编程问答--------------------
不同意。初始学习可以这样认为,以便于和C++的函数指针对应,但是不能说这是“实质上”。 --------------------编程问答-------------------- 100楼太高,我帮忙盖点. --------------------编程问答-------------------- 这个也太。。哎。。。算了,看看热闹。 --------------------编程问答-------------------- 只能路过。。。。 --------------------编程问答-------------------- 100+下 --------------------编程问答-------------------- 哎,菜鸟路过,望大神指点
--------------------编程问答-------------------- 哎,菜鸟路过,望大神指点
--------------------编程问答-------------------- 哎,菜鸟路过,望大神指点
--------------------编程问答-------------------- 可惜我不会啊~~~ --------------------编程问答-------------------- 关注下! --------------------编程问答-------------------- 厉害,学习学习
--------------------编程问答-------------------- 我也来添砖加瓦。。。 求真理。。。 导数是什么? 干嘛用的? --------------------编程问答-------------------- 设函数y=f(x)在点x0的某个邻域N(x0,δ)内有定义,当自变量x在x0处有增量△x(设x0+△x∈N(x0,δ)),函数y=f(x)相应的增量为△y=f(x0+△x)-f(x0).
如果当△x→0时,函数的增量△y与自变量的增量△x之比的极限lim △y/△x=lim [f(x0+△x)-f(x0)]/△x存在,则称这个极限值为f(x)在x0处的导数或变化率.通常可以记为f'(x0)或f'(x)|x=x0. --------------------编程问答-------------------- 精度要求如何呢? --------------------编程问答-------------------- 我想应该是这样。求某点的导数可以,但是求导函数呢??? --------------------编程问答-------------------- 楼上没有将导数不存在的情况考虑进去吧! --------------------编程问答-------------------- 路过................... --------------------编程问答-------------------- 初学者求解答……望大神指点…… --------------------编程问答-------------------- 学习了学习了 --------------------编程问答-------------------- kankan. --------------------编程问答-------------------- 1.算式转字符串(如"y=3x^2+2x+1")
2.字符串分析出("y'=6x+2")
3.再转算式
4.还是算了...
下面这个应该和32L一样的
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double x = 2d;
double y1 = LimFunc(Func1, x);
double y2 = LimFunc(Func2, x);
double y3 = LimFunc(Func3, x);
Console.WriteLine("{0}\t{1}\t{2}", y1, y2, y3);
Console.ReadKey();
}
delegate double FuncCallBack(double x);
static double Func1(double x)
{
double y = x + 1;
return y;
}
static double Func2(double x)
{
double y = Math.Pow(x, 3d) + Math.Pow(x, 2d) + x + 1;
return y;
}
static double Func3(double x)
{
double y = Math.Sqrt(x - 3d);
return y;
}
static double LimFunc(FuncCallBack f, double x)
{
double dx = 0.00001d;
double y_ = (f(x + dx) - f(x)) / dx;
return y_;
}
}
}
// 输出
// 1.00000000000655 17.0000700002504 非数字
--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 顶帖!!!求真相! --------------------编程问答-------------------- 哎~~都忘记了 --------------------编程问答-------------------- http://baike.baidu.com/view/295773.htm --------------------编程问答-------------------- 啊,不会啊,学习~~~ --------------------编程问答-------------------- 自动微分是一个研究课题,目前还没有真正成熟的算法8?LZ用它做面试,有点太哪个了点。。。 --------------------编程问答-------------------- 为求答案,顶! --------------------编程问答-------------------- 数值积分/微分呗,不行的话还有级数展开呢。反正计算机都是离散数据,需求是求一个数,那不就是套用数值公式吗?考点其实就是一个字符串分析,提取数学式子,剩下都是加减乘除。 --------------------编程问答-------------------- 记号一个。。。 --------------------编程问答-------------------- 求答案~~~ --------------------编程问答-------------------- 帮顶一下……………… --------------------编程问答-------------------- 帮顶一下……………… --------------------编程问答-------------------- 帮顶一下………………
--------------------编程问答-------------------- 学习。 --------------------编程问答-------------------- 顶一下,对于微积分表示压力很大 --------------------编程问答-------------------- 本来就不是学的很好 现在忘光了 。。。。。。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 哎,导数,忘得是干干净净了。。。 --------------------编程问答-------------------- 路过,学习一下 --------------------编程问答-------------------- 对任意函数表达式f(x)可以自动求导啊,,,
牛X,,
--------------------编程问答-------------------- 基本思路应该是这样的
不确定的函数用委托代表了
导数为dy/dx 当dx无限接近0时就求出该导数
用程序让dx从左右两侧分别不断取更小的数值,然后计算dy/dx
比如用等比方法,每次变化为上一次的1/2或1/4或1/8
应该用demical类型,可以求出更准确的结果
如果结果超过某很大的数,认为是无穷
(也许可以通过求dx/dy为0判定为无穷)
如果前后两次结果变化逐渐逼近,甚至为0,则认为成功求出该导数
具体代码不写了
反正对于不确定函数,估计只能用这种笨办法了 --------------------编程问答-------------------- 关注中…… --------------------编程问答-------------------- 帮顶一下……………… --------------------编程问答-------------------- 路过! --------------------编程问答-------------------- 把函数表达式写成这样的函数:
f(double x)
{
函数表达式
}
让一个指针指向这个函数,设为p;
求导方式为
derivative(void* p,double pos)
{
求导数计算极限!!
}
求极限不会哟,计算方法那门课没学好哟,,
坐等大牛哟
--------------------编程问答-------------------- dx 无限接近0时 f(x)无限接近f(x+dx)
所以在有限的精度内无法求出
dy的值
当dx无限接近0时
dy=f(x+dx)-f(x)计算机会认为是0
所有函数的导数就都是0了(分段函数除外)。
--------------------编程问答-------------------- 顶。求真相~~ --------------------编程问答-------------------- 层数,就是在无限接近某一个点时,x轴增量与y轴增量的比值。
如果是一元函数的话,可以说,就是这条直线的斜率 --------------------编程问答--------------------
计算方法很多!直接求dy=f(x+dx)-f(x),明显是完蛋了,得用别的方法了,计算方法那门课里有很多思想,方程逼近,补偿,迭代等来计算函数值,不能简单直接计算f(x),那样肯定没戏,, --------------------编程问答--------------------
是求导不是倒数 --------------------编程问答-------------------- 你说的有道理
应当多加判断以避免这种情况的出现了
也许还有更巧妙的方法,需要再考虑考虑
--------------------编程问答-------------------- 哎...叹气一声,然后走人. --------------------编程问答-------------------- 学习学习 --------------------编程问答-------------------- 纠结 看不懂。 学习下。 --------------------编程问答--------------------
没什么印象了 --------------------编程问答-------------------- 到底是C#面试题,还是数学家面试题。这和C#有什么必然联系么?除了那个“委托”…… --------------------编程问答-------------------- 帮顶一下把!!!!!!!! --------------------编程问答-------------------- 导数忘记了。 --------------------编程问答-------------------- 可能还是得用到计算方法里的,根据若干个己知函数点的值去近似拟合出原函数,再求导,,,还是拟合的思想吧,,坐等大牛哟,,坐等答案哟 --------------------编程问答-------------------- 函数有断点你怎么拟合?
拟合是处理离散函数的吧,根本不适用于这个问题
--------------------编程问答-------------------- 既然是拟合,还管原函数有没有什么断点不断点,只是提个建议而己
拟合只是保证原函数过哪些点,拟合出来的函数也过那些点,并且其它非计算点的值两函数都很接近,导数可能相近---最后这一点是我的想法,完全可以反对,但你要说拟合只能处理离散----你也不是个好学生哟,上课走神了吧,出题者也没限定原函数是个什么情况哟,呵呵,
--------------------编程问答-------------------- 99楼 --------------------编程问答-------------------- 100 --------------------编程问答-------------------- dx为负,和dx为正
分别求出值
相差大的不可导 --------------------编程问答-------------------- 100不分页了?
补充:.NET技术 , C#