题目
一个穷人到富人那里去借钱,原以为富人不愿意,哪知富人一口答应了下来,
但提出了如下条件:
- 在30天中,富人第一天借给穷人1万元,第二天借给2万,以后每天所借的钱数都比上一天的多一万;
- 但 借钱第一天,穷人还1分钱,第二天还2分钱,以后每天所还的钱数都是上一天的两倍。
- 30天后互不相欠,
穷人听后觉得挺划算,本想定下来,但又想到富人是个吝啬出了名的,怕上当,所以很为难。
分析是否应该借钱,并绘图表示看是否存在相交点,看规定多少天划算
import numpy as np
import matplotlib.pyplot as pltdef arithmetic_sequence_sum(begin,end,n): sum=(begin+end)*n/2return sumdef proportional_sequence_sum(begin,q,n):sum=(begin*(1-q**n))/(1-q)return sum#验证求和是否正确
#print(proportional_sequence_sum(1,2,30))
#print(arithmetic_sequence_sum(1,30,30))#借钱是一个等差数列,1开始,30结束,元素为30个
borrows=np.linspace(1,30,num=30)#还钱是一个等比数列,从1(2^0)开始,到2^29次方结束,注意单位是分
repayments=np.logspace(0,29,num=30,base=2)#记录每一天的借钱总数
borrows_sum=[0]
#记录每一天的还钱总数
repayments_sum=[0]for borrow in borrows:sum=borrows_sum[-1]+borrowborrows_sum.append(sum)for repayment in repayments:sum=(repayments_sum[-1]+repayment*0.01)#转换单位repayments_sum.append(sum)borrows_sum=np.array(borrows_sum)
repayments_sum=np.array(repayments_sum)#可视化分析
fig,ax=plt.subplots()
#后面的数据太大,我们用前16天的数据就可以
x_values=np.arange(1,16)ax.scatter(x_values,borrows_sum[1:16],label='borrow')
ax.scatter(x_values,repayments_sum[1:16],label='repay')ax.set_title("Is the rich kind to the poor?",fontsize=16)
ax.set_xlabel("day",fontsize=14)
ax.set_ylabel("money/rmb",fontsize=14)
#显示所有刻度
ax.set_xticks((range(1,17)))ax.legend()
plt.show()#利用numpy where计算亏钱的时间
diff=borrows_sum-repayments_sum
text=np.where(diff<0)
print(f"从{text[0][0]}天开始亏钱")
这是一个离散的问题,我们考虑画出散点图,从图中可以看出,从14天开始亏本
总结
学习到numpy如何生成等差等比数列
如何设置刻度
使用np.where函数传递表达式选择符合要求的数组
np.where(condition, [True_value], [False_value])
condition可以是表达式,也可以是布尔数组