爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 35821|回复: 8

[求助] 编程思路求解答

[复制链接]

新浪微博达人勋

发表于 2021-3-3 21:54:00 | 显示全部楼层 |阅读模式
20金钱
有大神可以教教我这么用python求解这个方程吗?A是已知量,怎么求出lamda的解,看了很多教程还是不太会.谢谢大神。

QQ截图20210303213538.png

最佳答案

查看完整内容

MATLAB程序: A = 1:10; % 填写A的值 for i = 1:length(A) syms lamda % 注意这里的lamda不是全局变量,是在循环里面的 a = A(i); lamda = solve(1+0.6/lamda+(1+1.2/lamda)^a==0,lamda); answer{i} = double(lamda); % 这里应该要使用cell,因为有些A的值的情况下有多个lamda的解 end python程序: from sympy import * import numpy as np A = np.linspace(1,10,10) # 输入A的值 for x in A: ...
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-3-3 21:54:01 | 显示全部楼层
本帖最后由 东水兽 于 2021-3-4 15:59 编辑

MATLAB程序:
A = 1:10; % 填写A的值
for i = 1:length(A)
    syms lamda % 注意这里的lamda不是全局变量,是在循环里面的
    a = A(i);
    lamda = solve(1+0.6/lamda+(1+1.2/lamda)^a==0,lamda);
    answer{i} = double(lamda); % 这里应该要使用cell,因为有些A的值的情况下有多个lamda的解
end

python程序:
from sympy import *
import numpy as np
A = np.linspace(1,10,10) # 输入A的值
for x in A:
    lamda = symbols('lamda')
    eq = 1 + 0.6 / lamda - (1 + 1.2 / lamda) ** x
    c = solve(eq, lamda)
    print(c)

两段程序的思路是一致的
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-3-4 08:46:42 | 显示全部楼层
二分法就可以吧
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-4 09:40:15 | 显示全部楼层
因为A是可变的,而且比较多,所以我想用一种简单点的方法,二分法我怕跑不出来程序。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-3-4 09:50:16 | 显示全部楼层
网上教程若不行,估计一对一教学会有所帮助
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-4 10:19:38 | 显示全部楼层
MyOpenGFM 发表于 2021-3-4 09:50
网上教程若不行,估计一对一教学会有所帮助

您可以提供一些方向吗
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-3-4 11:16:20 | 显示全部楼层
个人感觉可以先解方程得出lamuda的A的关系(方程可解,用求导的方式还是比较容易的),然后编程求解即可
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-3-4 11:29:56 | 显示全部楼层
import math

def func(cur_root):
    func = 1+0.6/cur_root -(1+1.2/cur_root)**2
    return func

def binary(convergence, left, right):
    print('current acceptable error: ' + str(convergence) + '\n')
    error = convergence + 1  # 循环开始条件
    cur_root = left
    count = 1
    while error > convergence:
        if abs(func(left)) < convergence:
            print('root = ' + str(left))
        elif abs(func(right)) < convergence:
            print('root = ' + str(left))
        else:
            print(str(count) + ' root = ' +str(cur_root))
            middle = (left + right) / 2
            if (func(left) * func(middle)) < 0:
                right = middle
            else:
                left = middle
            cur_root = left
        error = abs(func(cur_root))
        count += 1
convergence = float(input("your acceptable error:"))
left = float(input('left: '))
right = float(input('right: '))##输入左右区间
binary(convergence, left, right)

怎么说呢。我用python比较少,自己把A取为2,用二分法跑了一下,还是能正常运行出结果的,你可以把A加个循环什么的,或者自己手动换吧。

评分

参与人数 1金钱 +20 收起 理由
lzyyy + 20 大神谢谢!不过另一个答案更简单一点,不好.

查看全部评分

密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-4 20:56:05 | 显示全部楼层
谷梁陌尘 发表于 2021-3-4 11:29
import math

def func(cur_root):

不好意思,评语太长后面没写完
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表