Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 如何在openfoam中求解一元高次方程

如何在openfoam中求解一元高次方程

已定时 已固定 已锁定 已移动 OpenFOAM
19 帖子 3 发布者 12.5k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 星 离线
    星 离线
    星星星星晴
    写于2019年9月16日 12:42 最后由 编辑
    #1

    b9769d55-f854-4a9a-a672-26be66c51268-image.png
    如图
    k1 k2 We0 都是常数,我想求解 rbu

    原文中是这么说的
    The solution was numerically calculated using the linear interpolation method.

    我使用了二分法求该方程,但是问题是现在不知道该如何将其放入CloudFunction中。
    不知道哪里去define 一些东西。

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    写于2019年9月16日 12:43 最后由 编辑
    #2
    #include <iostream>
    #include "fvCFD.H"
    #include <stdio.h>
    #include <math.h>
    using namespace std;
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    long double f(float x){
    long double f;
    f= 0.75/1.414*8.5*0.45*5.0 * pow(x,3) + pow(x,2) - 1.0;
    return f;
    }
    // Main program:
    int main()
    {
    long double x1,x2,x0,t,counter = 0.0;
    x1 = -10;
    x2 = 10;
    do{
    x0=(x1+x2)/2.0;
    if( f(x0) * f(x1) > 0)
    {
    x1=x0;
    }
    else if (f(x0) * f(x1) < 0)
    {
    x2 = x0;
    }
    t =fabs( f(x0));
    counter +=1;
    cout <<"Counter = "<< counter <<nl;
    cout <<"t = "<< t <<nl;
    if (counter > 100000)
    {
    break;
    }
    }while(t> 1e-5);
    cout<<"x0 = "<<x0<<nl;
    cout << " solution = " << x0<<nl;
    cout << "Hello World "<<nl;
    return 0;
    }
    // ************************************************************************* //

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    写于2019年9月16日 12:47 最后由 编辑
    #3

    或者说有没有其他的解法?
    例如该方法能不能解?
    该如何修改该部分code呢??

    https://www.cfd-online.com/Forums/openfoam-programming-development/173789-how-solve-nonlinear-equation.html

    麻烦大佬指点 谢谢!

    游荡

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2019年9月16日 12:54 最后由 编辑
    #4

    你的方程就是求x3.5+x2−1=0的根吧?

    但是问题是现在不知道该如何将其放入CloudFunction中。

    不知道哪里去define 一些东西。

    你是要放在某个C程序里么还是什么地方?

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    写于2019年9月16日 12:55 最后由 编辑
    #5

    放在lagrangian 下面的submodel中

    游荡

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2019年9月16日 12:56 最后由 编辑
    #6

    求根可以直接写成任意一个rootFinding函数,可以放在任何subModels下面的.C文件里面?

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    星 4 条回复 最后回复 2019年9月16日 13:00
  • 星 离线
    星 离线
    星星星星晴
    在 2019年9月16日 13:00 中回复了 李东岳 最后由 编辑
    #7

    @东岳 大哥,这对我来说有点超纲

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 2019年9月16日 13:04 中回复了 李东岳 最后由 编辑
    #8

    求解该方程会在下面的这个class里面,但是我不知道在哪能定义f那个函数

    template<class CloudType>
    void Foam::IVT41_StochasticDDCollModel<CloudType>::postMove
    (
    parcelType& p,
    const label cellI,
    const scalar dt,
    const point&,
    bool&
    ) {
    //*code
    }

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 2019年9月16日 13:05 中回复了 李东岳 最后由 编辑
    #9

    @东岳 48a2851c-11ac-4cf6-931d-a3bdbf2855e9-image.png
    上图的函数会在lagrangian/intermediate/submodel/CloudFunctionObjects 里,是自定义的一个模型

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 2019年9月16日 15:10 中回复了 李东岳 最后由 编辑
    #10

    @东岳 是我着相了。。。我好傻,直接算就好了,干嘛搞一个class function。。。

    scalar k1 = 8.5;
    scalar k2 = 0.45;
    scalar rbu_avg;
    scalar x0 = 0.0;
    scalar x2_rlarge = Dmax/2.0;
    scalar x1_rsmall = Dmin/2.0;
    scalar sat_counter = 0;
    scalar eps = 0.0;
    do
    {
    	scalar x0 = (x2_rlarge + x1_rsmall) / 2.0;
    	scalar x0_ytempavg   = 0.75/sqrt(x0) * k1 *k2 * We0 * pow(x0,7.0/2.0) + pow(x0,2.0) - 1.0 ;
    	scalar x2_ytemplarge = 0.75/sqrt(x2_rlarge) * k1 *k2 * We0 * pow(x2_rlarge,7.0/2.0) + pow(x2_rlarge,2.0) - 1.0 ;
    	scalar x1_ytempsmall = 0.75/sqrt(x1_rsmall) * k1 *k2 * We0 * pow(x1_rsmall,7.0/2.0) + pow(x1_rsmall,2.0) - 1.0 ;
    
    	if( x0_ytempavg * x1_ytempsmall > 0)
    		{
    			x1_rsmall=x0;
    		}
    		else if (x0_ytempavg * x1_ytempsmall < 0)
    		{
    			x2_rlarge = x0;
    		}
    	eps = fabs( x0_ytempavg);
    
    	sat_counter +=1;
    
    	if (sat_counter > 100000)
    	{
    		break;
    	}
    }while(eps > 1e-6);
    
    rbu_avg = x0;
    

    游荡

    李 J 2 条回复 最后回复 2019年9月16日 23:01
  • 李 在线
    李 在线
    李东岳 管理员
    在 2019年9月16日 23:01 中回复了 星星星星晴 最后由 编辑
    #11

    @星星星星晴 是的

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • J 离线
    J 离线
    JqBu
    在 2022年4月27日 10:48 中回复了 星星星星晴 最后由 JqBu 编辑 2022年4月27日 18:55
    #12

    @星星星星晴 老师您好,我遇到了和您一样的问题,但是我把您这段代码算下来,遇到了几个问题:
    1.把这段代码放在OpenFOAM里的时候,会报错说重载的pow()模棱两可,“call of overloaded ‘pow(Foam::scalar&, Foam::scalar)’ is ambiguous”
    2.我用这段代码计算一元高次方程时候总不收敛,请问您之前有这问题吗?
    3.我也关注了您这篇帖子这部分内容,我看2007年的论文“A new predictive model for fragmenting and non-fragmenting binary droplet collisions”里说先把2.7次幂转换成4次幂和3次幂的两个方程,再用Runge-Kutta法进行了四次迭代,但是我没搞懂怎么用Runge-Kutta求解非微分方程,请问老师您后来尝试过用论文里的方法求解方程吗?或者对帖子里这段代码有什么改进吗?

    星 李 3 条回复 最后回复 2022年4月27日 11:05
  • 星 离线
    星 离线
    星星星星晴
    在 2022年4月27日 11:05 中回复了 JqBu 最后由 编辑
    #13

    @jqbu 哎呀 难得有个同行,这部分后来我没用二分法
    找到了一个 Newton-Raphson method iteration method。
    可能是当年弄的时候有问题?我也忘了,有点久远。
    反正我这边算起来还行,就再也没动过。

    游荡

    J 1 条回复 最后回复 2022年4月27日 14:03
  • 星 离线
    星 离线
    星星星星晴
    在 2022年4月27日 11:21 中回复了 JqBu 最后由 编辑
    #14

    @jqbu 聊一下~ 你是哪个学校的啊?

    游荡

    1 条回复 最后回复
  • J 离线
    J 离线
    JqBu
    写于2022年4月27日 13:56 最后由 编辑
    #15

    老师好,我是天津大学的学生,请问老师方便留个邮箱后续沟通吗?

    星 1 条回复 最后回复 2022年4月27日 15:04
  • J 离线
    J 离线
    JqBu
    在 2022年4月27日 14:03 中回复了 星星星星晴 最后由 编辑
    #16

    @星星星星晴 谢谢老师,我也尝试一下这个牛顿迭代法:xinxin:

    星 1 条回复 最后回复 2022年4月27日 18:13
  • 星 离线
    星 离线
    星星星星晴
    在 2022年4月27日 15:04 中回复了 JqBu 最后由 编辑
    #17

    @jqbu 好的,看我资料~

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 2022年4月27日 18:13 中回复了 JqBu 最后由 编辑
    #18

    @jqbu m.sui20@foxmail.com 我记得之前资料能显示邮件的。。现在不知道怎么设置回去了

    游荡

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    在 2022年4月28日 02:52 中回复了 JqBu 最后由 编辑
    #19

    @jqbu 在 如何在openfoam中求解一元高次方程 中说:

    会报错说重载的pow()模棱两可,“call of overloaded ‘pow(Foam::scalar&, Foam::scalar)’ is ambiguous”

    用:::pow()或者Foam::pow

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
2019年9月16日 12:42

2/19

2019年9月16日 12:43

未读 17
2022年4月28日 02:52
  • 登录

  • 登录或注册以进行搜索。
2 / 19
  • 第一个帖子
    2/19
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]