24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2263  |  回复: 10

zhenzhen5516

金虫 (小有名气)

[求助] 求助三元函数二阶偏微分C语言写法

求助三元函数二阶偏微分C语言写法,例如F=f(x,y,z),求 d2F/dxdy, d2F/dydz, d2F/dzdx之类的,步长可以简单的设为1。希望会的同学帮下忙,谢谢~~
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

你把算法直观地说一遍,我帮你写C语言要的不?

» 本帖已获得的红花(最新10朵)

漩涡的中心有一块空地,空空的。
2楼2011-08-31 12:59:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhenzhen5516

金虫 (小有名气)

送鲜花一朵
引用回帖:
2楼: Originally posted by huycwork at 2011-08-31 12:59:59:
你把算法直观地说一遍,我帮你写C语言要的不?

非常感谢!为了您方便看,我把算法上传到附件里了,麻烦您下载一下!只要您写出一项我应该就能明白了~
3楼2011-08-31 16:01:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)


余泽成(金币+1): 2011-09-01 15:42:43
引用回帖:
3楼: Originally posted by zhenzhen5516 at 2011-08-31 16:01:08:
非常感谢!为了您方便看,我把算法上传到附件里了,麻烦您下载一下!只要您写出一项我应该就能明白了~

呃,你太客气了……
我记得偏微分好像是常规微分在各个方向上微分之和,但你给出的符号都是啥意思呃?哪些是函数,哪些是变量,k是什么意思,各个函数跟哪些相关变量相关,那个下三角的意思又是什么呢?中括号括起来的参数xyz又是什么意思?这些还是要说清楚的嘛!
漩涡的中心有一块空地,空空的。
4楼2011-09-01 09:12:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhenzhen5516

金虫 (小有名气)

引用回帖:
4楼: Originally posted by huycwork at 2011-09-01 09:12:31:
呃,你太客气了……
我记得偏微分好像是常规微分在各个方向上微分之和,但你给出的符号都是啥意思呃?哪些是函数,哪些是变量,k是什么意思,各个函数跟哪些相关变量相关,那个下三角的意思又是什么呢?中括号括 ...

哦,可能是我没说清楚。函数是u1=u1(x,y,z), K 是常量,u只是x y z的函数,下三角是二次微分算子,具体的我另上传了一个附件,可供参考~谢谢,等待您的回复
5楼2011-09-01 10:07:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★ ★
余泽成(金币+3): 谢谢参与应助! 2011-09-01 15:42:56
引用回帖:
5楼: Originally posted by zhenzhen5516 at 2011-09-01 10:07:43:
哦,可能是我没说清楚。函数是u1=u1(x,y,z), K 是常量,u只是x y z的函数,下三角是二次微分算子,具体的我另上传了一个附件,可供参考~谢谢,等待您的回复

我大概知道你的困难了,你看是不是这样:
混合偏导数的定义式df/dxdy = d(df/dy)/dx,df/dy部分返回一个函数,而C语言没有直接支持返回带参函数的机制。
如果是这样的话,你可以自己实现闭包函数即可。比如说返回3x+4,一般情况下,需要先定义函数:
CODE:
double func(double a, double b, double x){
    return a*x+b;
}

如果需要返回这样一个函数,那等于说要返回这个:func(3, 4, x),如果用C++就有很明显的解决方法,C的解决方案也很简单,就是自己捆绑数据:
CODE:
typedef struct{
    double a, b;
    double (*func)(double a, double b, double x);
} CFunc;
CFunc *factory(double a, double b){
    CFunc *f = malloc(sizeof(CFunc));
    f->a = a;
    f->b = b;
    f->func = func;
    return f;
}
double caller(CFunc *fc, double x){
    return fc->func(fc->a, fc->b, x);
}

实现混合偏微分就是将偏微分实现为函数,df/dy返回一个CFunc,df/dxdy也返回一个CFunc即可。
漩涡的中心有一块空地,空空的。
6楼2011-09-01 10:45:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhenzhen5516

金虫 (小有名气)

引用回帖:
6楼: Originally posted by huycwork at 2011-09-01 10:45:05:
我大概知道你的困难了,你看是不是这样:
混合偏导数的定义式df/dxdy = d(df/dy)/dx,df/dy部分返回一个函数,而C语言没有直接支持返回带参函数的机制。
如果是这样的话,你可以自己实现闭包函数即可。比如说返 ...

呃,非常感谢您的详细回复。不过我没太看明白,其实我的问题就是df/dxdy = d(df/dy)/dx如何在程序里写进去,比如df2/dx2(表示函数F对x的二次微分)可以在程序里简单写成f(x+1,y,z)+f(x-1,y,z)-2f(x,y,z),那么d(df/dx)/dy可以写成 f(x,y,z)-f(x-1,y,z)-f(x,y-1,z)+f(x-1,y-1,z)或者其他什么形式呢?呃,说了这么多也不知道您明不明白我的问题,这是不是属于数学问题啊?晕了。。。
7楼2011-09-01 11:33:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★
余泽成(金币+2): 鼓励应助! 2011-09-01 15:43:06
引用回帖:
7楼: Originally posted by zhenzhen5516 at 2011-09-01 11:33:37:
呃,非常感谢您的详细回复。不过我没太看明白,其实我的问题就是df/dxdy = d(df/dy)/dx如何在程序里写进去,比如df2/dx2(表示函数F对x的二次微分)可以在程序里简单写成f(x+1,y,z)+f(x-1,y,z)-2f(x,y,z),那么d( ...

你没看明白我说的东西。你试试一些支持lambda表达式或者闭包的语言可能更能理解一些。
数学里面的函数完成的是一个映射,对应到C语言就是一个叫做函数的过程。两者的概念是一致的,即完成某种映射,但是C语言函数是一种函数过程形式,不能当做实体来用。就像火一样,你不能单独把火隔离出来,必须从木柴开始,拿走木柴,火才能跟着走。
你这样的求导问题,是对函数实体的作用过程,函数要当做实体来用,比如说ax^n+b的求导,求导是一个过程,函数本身却是一个参数,求导完成的是一个ax^n+b->anx^(n-1)的映射,定义域是函数实体,或者说是n-1阶导数,值域也是函数实体,或者说是n阶导数。
于是应该改变的一个观念就是,函数本身也该是一个数据,函数包含执行属性。
当然你说的要用数学另外的方式去求导终究还是要回归到这一点,n阶导数需要对n-1阶导数当做数据来求导,导数定义本身就说明了这一点。
你说的这种实际上需要转换成这样的表示:
CODE:
Func: f(x, y, z);
Funcx: df/dx = Func(x+dx, y, z) - Func(x, y, z)   / dx;
Funcy: df/dy = Func(x, y+dy, z) - Func(x, y, z)   / dy;
Funcz: df/dz = Func(x, y, z+dz) - Func(x, y, z)   / dz;
Funcyx: Funcy/dx = Funcy(x+dx, y, z) - Funcy(x, y, z)  / dx;
Funczy: Funcz/dy
Funcxz: Funcx/dz

设计好你需要的函数对象即可。

» 本帖已获得的红花(最新10朵)

漩涡的中心有一块空地,空空的。
8楼2011-09-01 13:53:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★
余泽成(金币+2): 辛苦了! 2011-09-01 15:43:33
要想你说的那种简单形式,有两点不好,第一个是扩展性不好,每种导数都需要设计一个求值方式,3阶混合导数,由于存在df/dxdy,df/dxdz,df/dydz,df/dydx,df/dzdy,df/dzdx六种形式,就需要设计六个形式,即3*2种形式,如果参数增多,比如5个参数,就有5*4种。另外,计算机本身完成的是离散量的运算,数值运算本身就不是精确的,这样更容易积累误差。一般形式也不是很复杂咯~
漩涡的中心有一块空地,空空的。
9楼2011-09-01 14:11:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhenzhen5516

金虫 (小有名气)

送鲜花一朵
引用回帖:
8楼: Originally posted by huycwork at 2011-09-01 13:53:10:
你没看明白我说的东西。你试试一些支持lambda表达式或者闭包的语言可能更能理解一些。
数学里面的函数完成的是一个映射,对应到C语言就是一个叫做函数的过程。两者的概念是一致的,即完成某种映射,但是C语言函 ...

嗯,真的非常感谢你,我想我明白了~~
10楼2011-09-01 14:16:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zhenzhen5516 的主题更新
信息提示
请填处理意见